對象的建立
在java中需要new對象的時候(僅限于對象,不包括數組和class對象等),其實在jvm中會經曆一系列的過程。
虛拟機在魚到new指令時,需要建立對象,于是就進行了以下的流程,我在此處盡量把文字轉換為了圖的形式來展現,具體的更多細節,還是參考書上寫的更為詳細
對象的存儲
對象在記憶體中存儲的布局可以分為三塊區域:對象頭、示例資料(Instance Data)、對其填充(Padding)。同時對象頭又分為兩部分,一部分存儲運作時資料,另一部分則是類型指針。
對象的通路定位
java需要通過棧上的reference資料來操作堆上的具體對象,可是在這個堆上隻有引用,是以關于具體怎麼找就取決于虛拟機的實作方式,目前主流的通路方式:
1.通過句柄通路對象
java堆劃分一塊兒記憶體來作為句柄池,reference中存儲的就是對象的句柄位址。
句柄包含了對象執行個體資料與類型資料各自的具體位址資訊。
2.通過直接指針通路對象
java堆對象的布局中就必須考慮如何放置通路類型資料的相關資訊,而reference中存儲的直接就是對象位址。
這兩種各有各的優勢:
1.通過句柄通路的方式是不需要修改reference,對象移動時隻需要修改句柄中的執行個體資料指針。
2.通過直接指針通路的好處時速度快,但是在java中通路對象很頻繁,是以這一類的開銷也是不容小視的,在現在讨論的hotspot中使用的是第二種方式來進行的。