1.JVM運行時數據區 (1)程式計數器:線程私有,可以看做是當前線程所執行的位元組碼的行號指示器。選取下一條位元組碼指令、分支、線程恢復等都需要程式計數器來完成。 (2)虛擬機棧:同樣是線程私有,它描述的是java方法執行的記憶體模型:每個方法在執行的同時,都會創建一個棧幀,用來存放局部變數表、操作數棧 ...
1.JVM運行時數據區
(1)程式計數器:線程私有,可以看做是當前線程所執行的位元組碼的行號指示器。選取下一條位元組碼指令、分支、線程恢復等都需要程式計數器來完成。
(2)虛擬機棧:同樣是線程私有,它描述的是java方法執行的記憶體模型:每個方法在執行的同時,都會創建一個棧幀,用來存放局部變數表、操作數棧、方法出口等信息。java方法從調用到執行,對應著一個棧幀在虛擬機棧中的入棧與出棧。
(3)本地方法棧:與虛擬機棧的作用類似,不同的是虛擬機棧為java方法的執行服務,而本地方法棧為本地方法服務。
(4)堆:線程共用,是java虛擬機中所管理記憶體最大的一部分,它用來存放對象實例以及數組。
(5)方法區:與java堆一樣是線程共用的,用於存儲已經被虛擬機載入的類信息、常量、靜態變數。
2.JVM中對象的創建過程
3.對象的記憶體佈局
對象在記憶體中存儲的佈局可以分為3塊區域:對象頭、實例數據和對齊填充。
HotSopt虛擬機對象頭包括兩部分信息,第一部分用於存儲對象自身的運行時數據,如哈希碼、GC分代年齡、鎖狀態標誌、線程持有的鎖等。第二部分是類型指針,虛擬機通過指針來確定這個對象是哪個類的實例。
實例數據是對象存儲的真正有效數據。
對齊填充不是必然存在的,沒有特別意義,起著占位符的作用。