1. 程式人生 > 實用技巧 >Java虛擬機器執行時資料區結構

Java虛擬機器執行時資料區結構

>>> hot3.png

本文部分參考自《Java虛擬機器規範(Java SE 7版)》的中譯本和周志明的《深入理解Java虛擬機器》,另加個人理解。原書對Java虛擬機器執行時資料區描述只有6頁,同時參考其他網路網資料,個人能力所限,不排除存在認知錯誤。

JVM將程式執行期間使用的記憶體劃分為若干個執行時資料區,其中一些會隨著虛擬機器啟動而建立,隨著虛擬機器退出而銷燬。另外一些與執行緒一一對應,隨著執行緒開始而建立,隨著執行緒結束而銷燬。資料區劃分如下圖所示意:

Java堆(Java Heap)

在JVM中,Java堆是可供各個執行緒共享的執行時記憶體區域,是供所有類例項和陣列物件分配記憶體的區域。Java堆在虛擬機器啟動時被建立,儲存了垃圾收集器(GC)管理的各種物件,這些物件無法顯式銷燬。

Java堆可能發生OutOfMemoryError錯誤。

方法區(Method Area)

方法區用於儲存已被虛擬機器載入的類的結構資訊,例如:執行時常量池、欄位和方法資料、建構函式和普通方法的位元組碼,還包括一些在類、例項、介面初始化時用到的特殊方法。

方法區邏輯上是Java堆的一部分,但JVM規範對方法區限制非常寬鬆,可以選擇不實現垃圾收集。實際因為型別解除安裝的條件非常苛刻,方法區的垃圾收集效果也不理想。

方法區可能發生OutOfMemoryError錯誤。

執行時常量池(Runtime Constant Pool)

每個類或介面的位元組碼中去了有類的版本、欄位、方法、介面等描述資訊外,還包含一個常量池表(constant_pool table),用於存放編譯期生成的各種字面值和符號引用,執行時常量池是這個常量池表的執行時表示形式。每個執行時常量池都在JVM的方法區中分配,在載入類和介面到虛擬機器後,就建立對應的執行時常量池。

在建立執行時常量池時,JVM可能會丟擲OutOfMemoryError錯誤。



PC計數器(Program Counter Register)

JVM執行緒私有,儲存當前執行緒正在執行的位元組碼指令的地址,如果正在執行的是Native方法,值為undefined,本記憶體區域沒有規定記憶體錯誤。

Java虛擬機器棧(Java Virtual Machine Stack)

在第一版中也稱為Java Stack,每一條JVM執行緒都有自己私有的Java虛擬機器棧,這個棧與執行緒同時建立,用於儲存棧幀(Frame)。

Java虛擬機器棧可能發生StackOverFlowError和OutOfMemoryError錯誤。

本地方法棧(Native Method Stack)

JVM執行緒私有,和Java虛擬機器棧作用類似,Java虛擬機器棧為虛擬機器執行Java方法服務,而本地方法棧為虛擬機器執行Native方法服務。JVM規範沒有規定本區域如何實現,Sun HotSpot虛擬機器直接把本地方法棧和Java虛擬機器棧合成了一個。和Java虛擬機器棧一樣,本地方法棧也可能丟擲StackOverFlowError和OutOfMemoryError錯誤。

棧幀(Stack Frame)


棧幀是用於儲存資料和部分過程結果的資料結構,每次方法呼叫對應一個棧幀,隨著方法呼叫而建立,隨著方法結束而銷燬。棧幀的空間分配在Java虛擬機器棧中,每個棧幀包括自己的本地變量表、運算元棧和動態連結(指向當前方法所屬類的執行時常量池的引用)。



轉載於:https://my.oschina.net/foodon/blog/354196