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

Java虛擬機(jī)在執(zhí)行Java程序的過程中會(huì)把它所管理的內(nèi)存劃分為若干個(gè)不同的數(shù)據(jù)區(qū)域。不同的區(qū)域有不同的用途,它們的創(chuàng)建和銷毀的時(shí)間點(diǎn)也有不同,這個(gè)就是該篇文章所要講述的內(nèi)容。


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

由所有線程共享的數(shù)據(jù)區(qū)域:方法區(qū)、Java堆。這些區(qū)域隨著虛擬機(jī)的啟動(dòng)而生成。
??線程隔離的數(shù)據(jù)區(qū)域:本地方法棧、Java虛擬機(jī)棧、程序計(jì)數(shù)器。這些區(qū)域依賴用戶線程的啟動(dòng)和結(jié)束來建立和銷毀。

運(yùn)行時(shí)數(shù)據(jù)區(qū)域.png
1、Java堆(Java Heap)

Java堆唯一的目的是存放對(duì)象實(shí)例和數(shù)組。同時(shí),Java堆也是垃圾收集器管理的主要區(qū)域,很多時(shí)候也稱為 GC堆(Garbage Collected Heap) **

2、方法區(qū)(Method Area)

方法區(qū)用于存儲(chǔ)已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。Java虛擬機(jī)規(guī)范將方法區(qū)描述為堆的一個(gè)邏輯部分,但是它卻有一個(gè)別名叫做Non-Heap,目的應(yīng)該是與Java堆區(qū)分開來。
??方法區(qū)中還有一個(gè)特殊的部分 —— 運(yùn)行時(shí)常量池。Class文件除了有類的版本、字段、方法、接口等描述信息外,還有一項(xiàng)信息是常量池(Constant Pool Table),用于存放編譯期生成的各種字面量和符號(hào)引用,這部分內(nèi)容在類加載后存放到方法區(qū)的運(yùn)行時(shí)常量池中。
??運(yùn)行時(shí)常量池另外一重要特征是動(dòng)態(tài)性,Java語(yǔ)言并不要求常量一定只能在編譯期間產(chǎn)生,運(yùn)行期間也可能將新的常量放入池中,這種特性可以體現(xiàn)在 String 類的 intern() 方法

3、Java虛擬機(jī)棧(Java Virtual Machine Stacks)

虛擬機(jī)棧描述的Java方法執(zhí)行的內(nèi)存模型:每個(gè)方法被執(zhí)行的時(shí)候都會(huì)同時(shí)創(chuàng)建一個(gè)棧幀(Stack Frame)**用于存儲(chǔ)局部變量表、操作棧、動(dòng)態(tài)鏈接、方法出口等信息。每個(gè)方法被調(diào)用的過程對(duì)應(yīng)著一個(gè)棧幀在虛擬機(jī)棧中從入棧到出棧的過程。

4、本地方法棧(Native Method Stacks)

本地方法棧與虛擬機(jī)棧功能相似,區(qū)別在于虛擬機(jī)棧執(zhí)行Java方法(也就是字節(jié)碼)服務(wù),而本地方法棧則是為虛擬機(jī)使用到的Native方法服務(wù)。一些虛擬機(jī)(例如:Sun HotSpot虛擬機(jī))直接把本地方法棧與虛擬機(jī)棧合二為一。

5、程序計(jì)數(shù)器(Program Couter Register)

程序計(jì)數(shù)器可以看做是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器。所以在執(zhí)行Java方法與Native方法的時(shí)候程序計(jì)數(shù)器的處理方式不一樣:
??如果線程正在執(zhí)行的是一個(gè)Java方法,這個(gè)計(jì)數(shù)器記錄的是正在執(zhí)行的虛擬機(jī)字節(jié)碼的地址;如果正在執(zhí)行的Native方法,這個(gè)計(jì)數(shù)器值則為空。


參考資料:《深入理解Java虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐》 ------ 周志明

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容