1. 程式人生 > >HotSpot虛擬機器在java堆中物件的分配、佈局和訪問

HotSpot虛擬機器在java堆中物件的分配、佈局和訪問

一.物件的建立

二.物件的記憶體佈局(一個物件在記憶體中是怎樣儲存的)

在HotSpot虛擬機器中,物件在記憶體中儲存的佈局可以分為3塊區域:物件頭、例項資料和對齊填充

HotSpot虛擬機器的物件頭包括兩部分資訊:第一部分是用於儲存物件自身的執行時資料,如雜湊碼、GC分代年齡、鎖狀態標註、執行緒持有的鎖等。另一部分是型別指標,即物件指向它的雷院資料的指標,虛擬機器通過這個指標來確定這個物件是那個類的例項

例項資料部分是物件真正儲存的有效資訊,也是在程式程式碼中定義的各種型別的欄位內容。無論是從父類繼承下來的,還是在子類中定義的,都需要記錄下來。這部分的儲存順序會受到虛擬機器分配策略引數和欄位在java原始碼中定義定義順序的影響。HotSpot虛擬機器預設的分配策略是longs/doubles、ints,shorts/chars,bytes/booleans,oops

第三部分對其填充部分不是必須的,他沒有實際意義,僅僅起到記憶體填充的作用

三.物件的訪問定位

java程式需要通過棧上的reference資料來操作堆上的具體物件。目前主流的訪問方式有使用控制代碼和直接指標兩種。

1.如果使用控制代碼訪問的話,那麼java堆中將會劃分出一塊記憶體作為控制代碼池,reference中儲存的就是物件的控制代碼地址,而控制代碼中包含了物件例項資料域型別資料各自的具體地址資訊。

2.如果使用直接指標訪問,那麼java堆物件的佈局中就必須考慮如何防止訪問型別資料的相關資訊,而reference中儲存的直接就是物件地址。

 對於HotSpot虛擬機器而言,它是以第二種方式進行物件訪問的。