詳解Java對象創建的過程及內存佈局

一、對象的內存佈局

對象頭

對象頭主要保存對象自身的運行時數據和用於指定該對象屬於哪個類的類型指針

實例數據

保存對象的有效數據,例如對象的字段信息,其中包括從父類繼承下來的。

對齊填充

對齊填充不是必須存在的,沒有特別的含義,隻起到一個占位符的作用。

二、對象的創建過程

實例化一個類的對象的過程是一個典型的遞歸過程。

在準備實例化一個類的對象前,首先準備實例化該類的父類,如果該類的父類還有父類,那麼準備實例化該類的父類的父類,依次遞歸直到遞歸到Object類。

此時,首先實例化Object類,再依次對以下各類進行實例化,直到完成對目標類的實例化。具體而言,在實例化每個類時,都遵循如下順序:

1.先依次執行實例變量初始化和實例代碼塊初始化

2.執行構造函數初始化。也就是說,編譯器會將實例變量初始化和實例代碼塊初始化相關代碼放到類的構造函數中去,並且這些代碼會被放在對超類構造函數的調用語句之後,構造函數本身的代碼之前。

三、對象訪問定位

Java程序需要通過棧上的引用數據來操作堆上的具體對象。

對象的訪問方式取決於虛擬機實現,目前主流的訪問方式有使用句柄和直接指針兩種。

句柄,可以理解為指向指針的指針,維護指向對象的指針變化,而對象的句柄本身不發生變化;指針,指向對象,代表對象的內存地址。

句柄

Java堆中劃分出一塊內存來作為句柄池,引用中存儲對象的句柄地址,而句柄中包含瞭對象實例數據與類型數據各自的具體地址信息。

對象類型數據是被虛擬機加載的類信息。

在這裡插入圖片描述

直接指針

直接指針方式中,並沒有劃分句柄池,引用中存儲的直接就是對象地址。

在這裡插入圖片描述

四、參考

周志明,《深入理解Java虛擬機》

到此這篇關於詳解Java對象創建的過程及內存佈局的文章就介紹到這瞭,更多相關Java對象創建及內存佈局內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: