虛擬機器物件探索

Z J 101發表於2020-12-08

1.物件的記憶體佈局

在HotSpot虛擬機器裡,物件在堆記憶體中的儲存佈局可以劃分為三個部分:物件頭、例項資料、對齊填充。
虛擬機器中物件的物件頭包括倆類資訊:

  • 用於儲存物件自身的執行時資料,如雜湊嗎、GC分代年齡、鎖狀態標誌、執行緒持有的鎖、偏向執行緒ID、偏向時間戳等,在32位和64位的虛擬機器中分別為32和64個位元,官方稱為“Mark Word”。
    考慮到虛擬機器的空間效率,Mark Word被設計成一個有著動態定義的資料結構,根據物件的複用自己的儲存空間。
  • 型別指標,即物件指向它的型別後設資料的指標,Java虛擬機器通過這個指標來確定該物件是那個類的例項。不是所有的虛擬機器實現都需要在物件資料上儲存型別指標,如使用控制程式碼訪問。

例項資料是物件真正儲存的有效資訊,即在程式程式碼裡面所定義的各種型別的欄位內容。

物件的第三部分是對齊填充,不是必然存在,僅起著佔位符的作用。由於虛擬機器的自動記憶體管理系統要求物件起始地址必須是8位元組的整數倍,任何物件大小都必須是8位元組的整數倍。物件頭部分已經被設計為8位元組的倍數,因此對齊填充是否存在由例項資料大小決定。

2.物件的訪問定位

Java程式會通過棧上的reference資料來操作堆上的具體物件。reference型別在《Java虛擬機器規範》規定它是一個指向物件的引用,沒有規範具體,所以物件訪問方式有虛擬機器實現,主流方式有使用控制程式碼和直接指標兩種:

  • 使用控制程式碼訪問的話,Java堆中將可能會劃分一塊記憶體來作為控制程式碼池,reference中儲存的就是物件的控制程式碼地址,控制程式碼地址中包含了物件例項資料與型別資料各自具體的地址資訊。
  • 如果使用直接指標訪問,Java堆中物件的記憶體佈局必須考慮如何放置訪問型別資料的相關資訊,reference中儲存的是物件地址。

兩種方式各有優勢,使用控制程式碼來訪問的話最大好處就是reference中儲存穩定控制程式碼地址,在物件被移動時只會改變控制程式碼中的例項資料指標,而本身不需要被修改。
使用直接指標來訪問最大的好處就是速度快,節省了一次指標定位的時間開銷,對HotSpot而言,主要使用第二種方式進行物件訪問。

在這裡插入圖片描述
通過控制程式碼訪問物件
在這裡插入圖片描述
通過直接指標訪問物件

相關文章