面試官:說說Java物件的組成

yes的練級手冊發表於2019-04-20

在java中物件對於我們來說再熟悉不過了,運用也簡單,什麼時候想要new一個,所以說啊我們們程式設計師不缺物件! 那我們真的瞭解物件嗎?它由哪幾部分組成呢? 在HotSpot虛擬機器中,也就是我們的常用虛擬機器。物件組成分為3個區域:物件頭、例項資料、對齊填充。

物件頭

物件頭分為兩個部分:物件自身執行時的資料,型別指標

物件自身執行時的資料,例如:HashCode、鎖狀態標誌、執行緒持有的鎖、偏向執行緒ID、偏向時間戳、GC分代年齡等。這部分資料長度在32位和64位虛擬機器(若未開啟壓縮指標)下分別為32bit和64bit。這部分稱為"Mark Word"。

並且Mark Word 被設計為沒有固定的資料結構用來在很小的空間內可以儲存更多的資訊,它會根據不同的狀態儲存不同的資料。例如在32位情況下,儲存內容的變化如下

面試官:說說Java物件的組成

型別指標,也就是指向此物件的類後設資料的指標,也就是通過這個指標來知道這個物件是哪個類的例項,但是不是所有的虛擬機器實現都是通過這個來查詢類的後設資料的。

像HotSpot虛擬機器,我們都知道平時new了一個物件儲存的是這個物件的引用,這個引用儲存的是物件例項的地址,而有些虛擬機器的實現是這個引用儲存的是一個物件的控制程式碼地址,控制程式碼地址又包含了物件例項地址和物件型別地址。

也就是這類虛擬機器有一個控制程式碼池,控制程式碼池內部儲存了物件的例項資料地址和類資料地址,所以這類虛擬機器可以直接通過控制程式碼池中類資料地址去找到這個物件是屬於哪個類的例項。

面試官:說說Java物件的組成
如果物件是個陣列,那還需要一塊地方來記錄資料的長度。

例項資料

例項資料就是物件真正儲存的資料區,各種型別的欄位內容。

對齊填充

這部分內容沒什麼別的意義,就是起著佔位符的作用,主要是因為HotSpot虛擬機器的記憶體管理要求物件的大小必須是8位元組的整數倍,而物件頭正好是8個位元組的整數倍,但是例項資料不一定,所以需要對齊填充補全。


如有錯誤歡迎指正!

個人公眾號:yes的練級攻略

相關文章