JVM運行時數據區域

程序計數器

一、 線程所執行的字節碼的行號指示器;
二、JVM的多線程是經過線程輪流切換並分配處理器執行時間的方式;
三、 每條線程都須要有一個獨立的程序計數器,因此是線程私有的內存區域;
四、 執行Java方法,記錄的是正在執行的虛擬機字節碼指令的地址;
五、 執行Native方法,計數器值爲空;
六、 惟一一個在JVM規範中沒有規定任何OOM狀況的區域;java

Java虛擬機棧

一、 是線程私有的,其生命週期與線程相同;
二、 是Java方法執行的內存模型;
三、 每一個方法執行的同時會建立一個棧幀,每一個方法從調用到執行完成的過程,對應着一個棧幀在虛擬機棧中從入棧到出棧;
四、 棧幀存放內容:局部變量表、操做數棧、動態連接、方法出口;
五、 局部變量表存放內容:編譯期可知的基本數據類型(byte,short,int,long,float,double,boolean,char)、對象引用、returnAddress類型;
六、 64位長度的long和double類型的數據會佔用2個局部變量空間,其他的佔用1個;
七、 局部變量表所需內存空間大小,在編譯期完成分配,方法運行期間不會改變;
八、 Java虛擬機棧會存在如下兩種類型的異常:
|異常類型|緣由|
|------------|------|
|StackOverflowError|線程所申請的棧深度大於虛擬機所容許的最大深度|
|OutOfMemoryError|JVM棧能夠動態擴展,若是擴展時沒法申請到足夠的內存|算法

本地方法棧

一、 做用與Java虛擬機棧類似,爲JVM使用的Native方法服務;
二、 有的虛擬機(例如Sun的HotSpot)把本地方法棧和虛擬機棧合二爲一;
三、 也會拋出兩種類型的異常:StackOverflowError和OutOfMemoryError;數組

Java堆區

一、 JVM管理的內存中最大的一塊;
二、 是被全部線程共享的一塊內存區域;
三、 虛擬機啓動時建立;
四、 惟一目的:存放對象實例(全部的對象實例和數組都是在堆上分配);
五、 是垃圾收集器管理的主要區域,也被稱爲「GC堆」;
六、 採用分代收集算法,Java堆細分爲:新生代、老年代。再細緻一點的有:Eden空間、From Survivor空間、To Survivor空間;
七、 Java堆能夠處於物理上不連續的內存空間中,只要邏輯連續便可;
八、 經過JVM參數 -Xmx和-Xms控制擴展;
九、 異常類型
|異常類型|緣由|
|------------|------|
|OutOfMemoryError|堆中沒有內存完成實例分配,且堆也沒法再擴展|多線程

方法區

一、 與堆同樣,也是各個線程共享的內存區域;
二、 存儲已經被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼;
三、 HotSpot中稱爲永久代;
四、 JDK1.7中已經把本來在永久代中的字符串常量池移出;
五、 該區域內存回收的目標主要是:針對常量池的回收和對類型的卸載;
六、異常類型
|異常類型|緣由|
|------------|------|
|OutOfMemoryError|方法區沒法知足內存分配需求時|線程

相關文章
相關標籤/搜索