【玩轉jvm系列 02】物件探祕
阿新 • • 發佈:2018-11-24
注意:本文描述的內容是基於HotSpot虛擬機器。
物件的建立
物件建立流程圖
物件建立流程
- 虛擬機器遇到一條new指令
- 檢查該指令引數在常量池中能否定位到對應類的符號引用
- 檢查該類是否被載入、解析和初始化,如果沒有必須先執行載入過程
- 虛擬機器為新生物件分配記憶體
- 虛擬機器將分配到的記憶體空間都初始化為零值
- 虛擬機器對物件進行必要的設定(設定物件頭)
- 執行<init>方法,把物件按照程式設計師的意願進行初始化
物件的記憶體佈局
在HotSpot虛擬機器中,物件在記憶體中儲存的佈局可以分為三個區域:物件頭(Header)、例項資料(Instance Data)和對齊填充(Padding)。
- 物件頭包含兩部分
- 第一部分儲存物件自身的執行時資料,如HashCode、GC分代年齡、執行緒持有的鎖等。
- 第二部分是型別指標,即物件指向它的類元資料的指標。如果物件是陣列,物件頭必須又一塊用於記錄陣列長度的資料。
- 例項數部分(物件Body部分)
- 儲存程式碼中所定義的各種型別的欄位內容。
- 無論子父類,都需要記錄下路。
- 對齊填充
- 對齊填充不是必然存在的,也沒有特別含義,僅僅起佔位符的作用。
- 物件的大小必須是8位元組的整數倍,不足就通過對齊填充補充。
物件的訪問定位
目前主流的訪問方式有使用控制代碼和直接指標兩種。
使用控制代碼方式
使用控制代碼訪問的最大好處就是reference中儲存的是穩定的控制代碼地址,在物件被移動時只會改變控制代碼中的例項資料指標,而reference本身不需要修改。
直接指標訪問方式
直接指標訪問的方式的最大好處就是速度更快,它節省了一次指標定位的時間開銷,由於物件的訪問在Java中非常頻繁,因此這類開銷積少成多後也是一項非常可觀的執行成本。
小結
虛擬機器Sun HotSpot,它使用的是第二種方式進行物件訪問的,但從整個軟體開發的範圍看,各種語言和框架使用控制代碼來訪問的情況也十分常見。
呆萌鍾, 版權所有丨如未註明 , 均為原創丨本網站採用BY-NC-SA協議進行授權 , 轉載請註明【玩轉jvm系列 02】物件探祕!