java 内存分布_一图看懂JVM内存分布,永久记住!
經(jīng)常在說JVM內(nèi)存分布,也經(jīng)常去看,但是總是在面試的時候說不清楚或者模糊,甚至有可能說錯,只有真正的理解,并且在心中有一個總結(jié)構(gòu)圖才能記得清楚說的清楚!
| JVM總覽圖
java內(nèi)存區(qū)域主要分程序計數(shù)器、Java虛擬機(jī)棧、本地方法棧、Java堆、方法區(qū)、直接內(nèi)存。其中程序計數(shù)器、Java虛擬機(jī)棧、本地方法棧屬于線程隔離,即他們都有自己的線程歸屬,其他屬于線程共享的。
| 各分區(qū)詳解
a、程序計數(shù)器
這個是當(dāng)前線程正在執(zhí)行的字節(jié)碼行號指示器。根據(jù)這里面的內(nèi)存數(shù)據(jù)來確定程序接下來執(zhí)行的指令。每個線程都有一個,相互隔離,線程切換回來時才知道怎么執(zhí)行。如果執(zhí)行的是方法,這里記錄的是虛擬機(jī)字節(jié)碼指令的地址。當(dāng)執(zhí)行的是Native方法的時候?yàn)榭?Undefined)。
因?yàn)橹淮鎯σ粋€指令,所以它不會出現(xiàn)任何OutOfMemoryError。也是唯一一個!
b、Java虛擬機(jī)棧
每個線程私有,里面裝的多個棧幀,每個棧幀對于的一個方法。里面存儲的是Java方法的內(nèi)存模型。相當(dāng)于描述的是一個方法需要的內(nèi)容。
如下圖,每個線程都有一個虛擬機(jī)棧,每個棧中都有多個棧幀。每個棧幀代表一個方法,一個方法的執(zhí)行就是棧幀的進(jìn)棧與出棧。
比如一個main方法調(diào)用了Method1(),Method1()調(diào)用Method2()。當(dāng)線程執(zhí)行的時候,先main方法對應(yīng)的棧幀壓入虛擬機(jī)棧,作為棧幀1。然后調(diào)用Method1()時,Method1()對應(yīng)的棧幀壓入虛擬機(jī)棧,作為棧幀2。然后調(diào)用Method2()時對應(yīng)的棧幀壓入虛擬機(jī)棧作為棧幀3。當(dāng)Method2()方法執(zhí)行完成,棧幀3彈出。接著Method1()繼續(xù)執(zhí)行,執(zhí)行完成棧幀2彈出,接著main方法繼續(xù)執(zhí)行,執(zhí)行完成棧幀1彈出。整個方法執(zhí)行完成。
每個棧幀存就是對方法的描述。其中局部變量表就是一個方法里面定義的變量,其中包括:基本數(shù)據(jù)類型(boolean、byte、char、short、int、float、long、double)和對象引用。
注:long和double會占兩個局部變量空間。
異常:線程請求的棧深度大于虛擬機(jī)允許的深度,將拋出StackOverflowError異常。如果虛擬機(jī)棧可以動態(tài)擴(kuò)展,當(dāng)擴(kuò)展的時候沒有申請到內(nèi)存的時候拋出OutOfMemoryError.
c、本地方法棧
線程私有,和上一個Java虛擬機(jī)棧作用相似,Java虛擬機(jī)棧是為Java方法服務(wù),本地方法棧是為Native服務(wù)。
d、Java堆
Java虛擬機(jī)管理最大的一塊,線程共享,存放對象實(shí)例和數(shù)組。分新生代(1/3)和老年代(2/3),新生代還可以分Eden(8/10)、From Survivor(1/10) 、To Survivor(1/10),是主要根據(jù)垃圾清理來分的。
異常:無法再對對象實(shí)例分配,并且堆也無法擴(kuò)展時,將拋出OutOfMemoryError。
e、方法區(qū)
線程共享,主要存儲被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼。
運(yùn)行時常量池也是方法區(qū)的一部分,比如String有一個常量池,他就是放到這個里面的。
異常:當(dāng)方法區(qū)無法滿足內(nèi)存分配時,將拋出OutOfMemoryError異常。
f、直接內(nèi)存
NIO通過使用Native函數(shù)庫直接分配對外內(nèi)存。
異常:不受Java堆大小限制,但是受機(jī)器的物理內(nèi)存限制,當(dāng)各個內(nèi)存區(qū)域大于機(jī)器物理內(nèi)存的時候,會出現(xiàn)OutOfMemoryError。
| 總結(jié)
Java作為面向?qū)ο蟮囊婚T語言,表面上是JVM內(nèi)存分布以線程劃分,實(shí)則主要也是類和對象的分布。簡單的總結(jié)對比圖:
Java程序員日常學(xué)習(xí)筆記,如理解有誤歡迎各位交流討論!
總結(jié)
以上是生活随笔為你收集整理的java 内存分布_一图看懂JVM内存分布,永久记住!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转载] JAVA基础----java中
- 下一篇: code iban 是有什么组成_深入浅