1. 程式人生 > >【玩轉jvm系列 02】物件探祕

【玩轉jvm系列 02】物件探祕

注意:本文描述的內容是基於HotSpot虛擬機器。

物件的建立

物件建立流程圖

image

物件建立流程

  1. 虛擬機器遇到一條new指令
  2. 檢查該指令引數在常量池中能否定位到對應類的符號引用
  3. 檢查該類是否被載入、解析和初始化,如果沒有必須先執行載入過程
  4. 虛擬機器為新生物件分配記憶體
  5. 虛擬機器將分配到的記憶體空間都初始化為零值
  6. 虛擬機器對物件進行必要的設定(設定物件頭)
  7. 執行<init>方法,把物件按照程式設計師的意願進行初始化

物件的記憶體佈局

在HotSpot虛擬機器中,物件在記憶體中儲存的佈局可以分為三個區域:物件頭(Header)、例項資料(Instance Data)和對齊填充(Padding)。

image

  • 物件頭包含兩部分
    • 第一部分儲存物件自身的執行時資料,如HashCode、GC分代年齡、執行緒持有的鎖等。
    • 第二部分是型別指標,即物件指向它的類元資料的指標。如果物件是陣列,物件頭必須又一塊用於記錄陣列長度的資料。
  • 例項數部分(物件Body部分)
    • 儲存程式碼中所定義的各種型別的欄位內容。
    • 無論子父類,都需要記錄下路。
  • 對齊填充
    • 對齊填充不是必然存在的,也沒有特別含義,僅僅起佔位符的作用。
    • 物件的大小必須是8位元組的整數倍,不足就通過對齊填充補充。

物件的訪問定位

目前主流的訪問方式有使用控制代碼直接指標兩種。

使用控制代碼方式

image

使用控制代碼訪問的最大好處就是reference中儲存的是穩定的控制代碼地址,在物件被移動時只會改變控制代碼中的例項資料指標,而reference本身不需要修改。

直接指標訪問方式

image

直接指標訪問的方式的最大好處就是速度更快,它節省了一次指標定位的時間開銷,由於物件的訪問在Java中非常頻繁,因此這類開銷積少成多後也是一項非常可觀的執行成本。

小結

虛擬機器Sun HotSpot,它使用的是第二種方式進行物件訪問的,但從整個軟體開發的範圍看,各種語言和框架使用控制代碼來訪問的情況也十分常見。

呆萌鍾, 版權所有丨如未註明 , 均為原創丨本網站採用BY-NC-SA協議進行授權 , 轉載請註明【玩轉jvm系列 02】物件探祕!