Java虛擬機運行時數據區結構

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

JVM將程序運行期間使用的內存劃分爲若干個運行時數據區,其中一些會隨着虛擬機啓動而建立,隨着虛擬機退出而銷燬。另一些與線程一一對應,隨着線程開始而建立,隨着線程結束而銷燬。數據區劃分以下圖所示意: 網絡

Java堆(Java Heap) 數據結構

在JVM中,Java堆是可供各個線程共享的運行時內存區域,是供全部類實例和數組對象分配內存的區域。Java堆在虛擬機啓動時被建立,存儲了垃圾收集器(GC)管理的各類對象,這些對象沒法顯式銷燬。 函數

Java堆可能發生OutOfMemoryError錯誤。 spa

方法區(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虛擬機棧中,每一個棧幀包括本身的本地變量表、操做數棧和動態連接(指向當前方法所屬類的運行時常量池的引用)。

相關文章
相關標籤/搜索