JVM是按照運行時數據的存儲結構來劃分記憶體結構的。JVM在運行Java程式時,將他們劃分成不同格式的數據,分別存儲在不同的區域,這些數據就是運行時數據。運行時數據區域包括堆,方法區,運行時常量池,程式計數器,虛擬機棧,本地方法棧。 ...
JVM是按照運行時數據的存儲結構來劃分記憶體結構的。JVM在運行Java程式時,將他們劃分成不同格式的數據,分別存儲在不同的區域,這些數據就是運行時數據。運行時數據區域包括堆,方法區,運行時常量池,程式計數器,虛擬機棧,本地方法棧。
Java堆
Java堆是JVM所管理的記憶體中最大的,是被所有線程共用的一塊記憶體區域,在虛擬機啟動時創建,唯一目的就是存放對象實例。所有對象實例及數組都在堆上分配記憶體
方法區(別名非堆)
用於存放被裝載的類型信息、類型的常量池、欄位信息、方法信息、類靜態變數、ClassLoader的引用、Class的引用類型信息。
運行時常量池
運行時常量池是方法區的一部分,在Class文件被載入後,存放編譯期生成的各種字面量和符號引用
程式計數器
程式計數器是一塊較小的記憶體空間,可以把它看成指向待執行位元組碼的指針,分支,迴圈,跳轉,異常處理,線程恢復等都需要依賴計數器。程式計數器是線程私有的。
虛擬機棧和本地方法棧
虛擬機棧是線程私有的,生命周期和線程相同,虛擬機棧描述的是Java方法執行的記憶體模型,每個方法在執行時都會創建一個棧幀,用於存儲局部變數表、操作數棧、動態鏈接、方法出口等信息。
局部變數表存放了編譯期可知的各種基本數據類型、對象引用模型和returnedAddress類型(指向一條位元組指令碼的地址)
在JVM規範中,線程請求的棧深度大於虛擬機所允許的深度,會拋出StackOverflowError異常,虛擬機動態擴展時無法申請到足夠的記憶體時,會拋出OutOfMemoryError異常。