天天看點

【深入了解JVM】(二)在HotSpot JVM中的對象

對象的建立

在java中需要new對象的時候(僅限于對象,不包括數組和class對象等),其實在jvm中會經曆一系列的過程。

虛拟機在魚到new指令時,需要建立對象,于是就進行了以下的流程,我在此處盡量把文字轉換為了圖的形式來展現,具體的更多細節,還是參考書上寫的更為詳細

【深入了解JVM】(二)在HotSpot JVM中的對象

對象的存儲

對象在記憶體中存儲的布局可以分為三塊區域:對象頭、示例資料(Instance Data)、對其填充(Padding)。同時對象頭又分為兩部分,一部分存儲運作時資料,另一部分則是類型指針。

【深入了解JVM】(二)在HotSpot JVM中的對象

對象的通路定位

java需要通過棧上的reference資料來操作堆上的具體對象,可是在這個堆上隻有引用,是以關于具體怎麼找就取決于虛拟機的實作方式,目前主流的通路方式:

1.通過句柄通路對象

java堆劃分一塊兒記憶體來作為句柄池,reference中存儲的就是對象的句柄位址。

句柄包含了對象執行個體資料與類型資料各自的具體位址資訊。

【深入了解JVM】(二)在HotSpot JVM中的對象

2.通過直接指針通路對象

java堆對象的布局中就必須考慮如何放置通路類型資料的相關資訊,而reference中存儲的直接就是對象位址。

【深入了解JVM】(二)在HotSpot JVM中的對象

這兩種各有各的優勢:

1.通過句柄通路的方式是不需要修改reference,對象移動時隻需要修改句柄中的執行個體資料指針。

2.通過直接指針通路的好處時速度快,但是在java中通路對象很頻繁,是以這一類的開銷也是不容小視的,在現在讨論的hotspot中使用的是第二種方式來進行的。