自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

深入理解JVM之內(nèi)存區(qū)域與內(nèi)存溢出

開發(fā) 后端
與虛擬機(jī)棧相似,主要為虛擬機(jī)使用到的Native方法服務(wù),在HotSpot虛擬機(jī)中直接把本地方法棧與虛擬機(jī)棧二合一.

文章目錄

  1. 1. Java內(nèi)存區(qū)域與內(nèi)存溢出異常

    1. 1.1. 運(yùn)行時(shí)數(shù)據(jù)區(qū)域

      1. 1.1.1. 程序計(jì)數(shù)器

      2. 1.1.2. java虛擬機(jī)棧

      3. 1.1.3. 本地方法棧

      4. 1.1.4. Java堆(Java Heap)

      5. 1.1.5. 方法區(qū)

      6. 1.1.6. 運(yùn)行時(shí)常量池

      7. 1.1.7. 直接內(nèi)存

    2. 1.2. HotSpot虛擬機(jī)

      1. 1.2.1. 對(duì)象的創(chuàng)建

      2. 1.2.2. 對(duì)象的訪問定位

    3. 1.3. OOM異常的解決思路

    4. 1.4. 參考

深入理解jvm之內(nèi)存區(qū)域與內(nèi)存溢出

Java內(nèi)存區(qū)域與內(nèi)存溢出異常

運(yùn)行時(shí)數(shù)據(jù)區(qū)域

深入理解jvm之內(nèi)存區(qū)域與內(nèi)存溢出

程序計(jì)數(shù)器

  • 當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器

  • 當(dāng)前線程私有

  • 不會(huì)出現(xiàn)OutOfMemoryError情況

java虛擬機(jī)棧

  • 線程私有,生命周期與線程相同

  • java方法執(zhí)行的內(nèi)存模型,每個(gè)方法執(zhí)行的同時(shí)都會(huì)創(chuàng)建一個(gè)棧幀,存儲(chǔ)局部變量表(基本類型、對(duì)象引用)、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口等信息

  • StackOverflowError異常:當(dāng)線程請求的棧深度大于虛擬機(jī)所允許的深度

  • OutOfMemoryError異常:如果棧的擴(kuò)展時(shí)無法申請到足夠的內(nèi)存

本地方法棧

與虛擬機(jī)棧相似,主要為虛擬機(jī)使用到的Native方法服務(wù),在HotSpot虛擬機(jī)中直接把本地方法棧與虛擬機(jī)棧二合一

Java堆(Java Heap)

java堆是被所有線程共享的一塊內(nèi)存區(qū)域,在 虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建。此區(qū)域的***目的就是存儲(chǔ)對(duì)象實(shí)例。java堆是垃圾收集器管理的主要區(qū)域。java堆還可以細(xì)分為:新生代與老年代。在細(xì)一點(diǎn)有 Eden空間、Form Survivor空間、To Survivor空間等。

  • 可以通過-Xmx和-Xms控制堆的大小

  • OutOfMemoryError異常:當(dāng)在堆中沒有內(nèi)存完成實(shí)例分配,且堆也無法再擴(kuò)展時(shí)。

方法區(qū)

  • 線程間共享

  • 用于存儲(chǔ)已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)

  • OutOfMemoryError異常:當(dāng)方法區(qū)無法滿足內(nèi)存的分配需求時(shí)

運(yùn)行時(shí)常量池

  • 方法區(qū)的一部分

  • 用于存放編譯期生成的各種字面量與符號(hào)引用

  • OutOfMemoryError異常:當(dāng)常量池?zé)o法再申請到內(nèi)存時(shí)

直接內(nèi)存

  • NIO可以使用Native函數(shù)庫直接分配堆外內(nèi)存,堆中的DirectByteBuffer對(duì)象作為這塊內(nèi)存的引用進(jìn)行操作

  • 大小不受Java堆大小的限制,受本機(jī)(服務(wù)器)內(nèi)存限制

  • OutOfMemoryError異常:系統(tǒng)內(nèi)存不足時(shí)

HotSpot虛擬機(jī)

對(duì)象的創(chuàng)建

虛擬機(jī)遇到一條new指令時(shí),首先將去檢查這個(gè)對(duì)象的參數(shù)是否在常量池中定位到一個(gè)類的符號(hào)引用,并且檢查這個(gè)符號(hào)引用代表的類是否已被加載、解析和初始化過。如果沒有,必須先執(zhí)行類的加載過程。
在類加載檢查通過后,虛擬機(jī)將為新生對(duì)象分配內(nèi)存。對(duì)象所需內(nèi)存大小再類加載完成后便可確定。內(nèi)存分配可以采用“指針碰撞”與“空閑列表”的方式。

對(duì)象的訪問定位

java程序需要通過棧上的reference數(shù)據(jù)來操作堆上的具體對(duì)象。訪問方式有使用句柄和直接指針兩種。

  • 句柄訪問 java堆中將會(huì)劃分出一塊內(nèi)存來作為句柄池,reference中存儲(chǔ)的就是對(duì)象的句柄地址,而句柄中包含了對(duì)象實(shí)例數(shù)據(jù)與類型數(shù)據(jù)各自的具體地址信息

  • 直接指針訪問 java堆對(duì)象的布局中必須考慮如何放置訪問類型數(shù)據(jù)的相關(guān)信息,reference中存儲(chǔ)的就是對(duì)象地址

OOM異常的解決思路

生成Dump快照文件:

  • 通過jvm參數(shù)—XX:-HeapDumpOnOutOfMemoryError可以讓JVM在出現(xiàn)內(nèi)存溢出是Dump出當(dāng)前的內(nèi)存轉(zhuǎn)儲(chǔ)快照

  • 用jmap生產(chǎn)dump文件,win通過任務(wù)管理器查看tomcat的進(jìn)程pid,linux用ps命令查看進(jìn)程pid,然后用jmap命令

先通過內(nèi)存映像分析工具(如Eclipse的Memory Analyzer)進(jìn)行分析,常見的情況有:

  • 內(nèi)存泄露,對(duì)象已經(jīng)死了,無法通過垃圾收集器進(jìn)行自動(dòng)回收,通過找出泄露的代碼位置和原因,才好確定解決方案;

  • 內(nèi)存溢出,內(nèi)存中的對(duì)象都還必須存活著,這說明Java堆分配空間不足,檢查堆設(shè)置大小(-Xmx與-Xms),檢查代碼是否存在對(duì)象生命周期太長、持有狀態(tài)時(shí)間過長的情況。

OOM異常示例:

package oom;

 

  1. import java.util.ArrayList; 
  2. import java.util.List; 
  3.  
  4. /** 
  5. * VM Args: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError 
  6. * @ClassName: HeapOOM 
  7. * 
  8. */ 
  9. public class HeapOOM { 
  10.     static class OOMObject{ 
  11.  
  12.     } 
  13.  
  14.     public static void main(String[] args) { 
  15.         List<OOMObject> list = new ArrayList<OOMObject>(); 
  16.         while(true){ 
  17.             list.add(new OOMObject()); 
  18.         } 
  19.     } 
責(zé)任編輯:王雪燕 來源: wustrive's blog
相關(guān)推薦

2021-11-26 00:00:48

JVM內(nèi)存區(qū)域

2023-11-05 12:05:35

JVM內(nèi)存

2020-05-27 21:13:27

JavaJVM內(nèi)存

2020-08-10 17:49:25

JVM內(nèi)存溢出

2010-09-25 12:54:24

JVM內(nèi)存

2021-09-08 17:42:45

JVM內(nèi)存模型

2023-10-27 07:47:58

Java語言順序性

2023-09-19 22:47:39

Java內(nèi)存

2013-06-20 10:25:56

2020-11-04 15:35:13

Golang內(nèi)存程序員

2022-07-06 08:05:52

Java對(duì)象JVM

2023-12-31 12:56:02

C++內(nèi)存編程

2021-05-19 07:56:26

Linux內(nèi)核搶占

2012-05-15 02:04:22

JVMJava

2015-03-24 13:28:52

Java Java Strin內(nèi)存模型

2022-06-22 08:02:11

CPU操作系統(tǒng)Java

2022-08-21 16:52:27

Linux虛擬內(nèi)存

2024-03-11 08:22:40

Java內(nèi)存泄漏

2018-11-01 10:34:37

JVM內(nèi)存配置

2015-03-30 11:18:50

內(nèi)存管理Android
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)