日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 内存分布_一图看懂JVM内存分布,永久记住!

發(fā)布時間:2025/3/11 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 内存分布_一图看懂JVM内存分布,永久记住! 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

經(jīng)常在說JVM內(nèi)存分布,也經(jīng)常去看,但是總是在面試的時候說不清楚或者模糊,甚至有可能說錯,只有真正的理解,并且在心中有一個總結(jié)構(gòu)圖才能記得清楚說的清楚!

| JVM總覽圖

java內(nèi)存區(qū)域主要分程序計數(shù)器、Java虛擬機棧、本地方法棧、Java堆、方法區(qū)、直接內(nèi)存。其中程序計數(shù)器、Java虛擬機棧、本地方法棧屬于線程隔離,即他們都有自己的線程歸屬,其他屬于線程共享的。

| 各分區(qū)詳解

a、程序計數(shù)器

這個是當前線程正在執(zhí)行的字節(jié)碼行號指示器。根據(jù)這里面的內(nèi)存數(shù)據(jù)來確定程序接下來執(zhí)行的指令。每個線程都有一個,相互隔離,線程切換回來時才知道怎么執(zhí)行。如果執(zhí)行的是方法,這里記錄的是虛擬機字節(jié)碼指令的地址。當執(zhí)行的是Native方法的時候為空(Undefined)。

因為只存儲一個指令,所以它不會出現(xiàn)任何OutOfMemoryError。也是唯一一個!

b、Java虛擬機棧

每個線程私有,里面裝的多個棧幀,每個棧幀對于的一個方法。里面存儲的是Java方法的內(nèi)存模型。相當于描述的是一個方法需要的內(nèi)容。

如下圖,每個線程都有一個虛擬機棧,每個棧中都有多個棧幀。每個棧幀代表一個方法,一個方法的執(zhí)行就是棧幀的進棧與出棧。

比如一個main方法調(diào)用了Method1(),Method1()調(diào)用Method2()。當線程執(zhí)行的時候,先main方法對應(yīng)的棧幀壓入虛擬機棧,作為棧幀1。然后調(diào)用Method1()時,Method1()對應(yīng)的棧幀壓入虛擬機棧,作為棧幀2。然后調(diào)用Method2()時對應(yīng)的棧幀壓入虛擬機棧作為棧幀3。當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會占兩個局部變量空間。

異常:線程請求的棧深度大于虛擬機允許的深度,將拋出StackOverflowError異常。如果虛擬機棧可以動態(tài)擴展,當擴展的時候沒有申請到內(nèi)存的時候拋出OutOfMemoryError.

c、本地方法棧

線程私有,和上一個Java虛擬機棧作用相似,Java虛擬機棧是為Java方法服務(wù),本地方法棧是為Native服務(wù)。

d、Java堆

Java虛擬機管理最大的一塊,線程共享,存放對象實例和數(shù)組。分新生代(1/3)和老年代(2/3),新生代還可以分Eden(8/10)、From Survivor(1/10) 、To Survivor(1/10),是主要根據(jù)垃圾清理來分的。

異常:無法再對對象實例分配,并且堆也無法擴展時,將拋出OutOfMemoryError。

e、方法區(qū)

線程共享,主要存儲被虛擬機加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼。

運行時常量池也是方法區(qū)的一部分,比如String有一個常量池,他就是放到這個里面的。

異常:當方法區(qū)無法滿足內(nèi)存分配時,將拋出OutOfMemoryError異常。

f、直接內(nèi)存

NIO通過使用Native函數(shù)庫直接分配對外內(nèi)存。

異常:不受Java堆大小限制,但是受機器的物理內(nèi)存限制,當各個內(nèi)存區(qū)域大于機器物理內(nèi)存的時候,會出現(xiàn)OutOfMemoryError。

| 總結(jié)

Java作為面向?qū)ο蟮囊婚T語言,表面上是JVM內(nèi)存分布以線程劃分,實則主要也是類和對象的分布。簡單的總結(jié)對比圖:

Java程序員日常學(xué)習(xí)筆記,如理解有誤歡迎各位交流討論!

總結(jié)

以上是生活随笔為你收集整理的java 内存分布_一图看懂JVM内存分布,永久记住!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。