物件例項化記憶體佈局與訪問定位
阿新 • • 發佈:2021-07-29
1. 建立物件的方式:
- new:使用new 關鍵字建立物件,最常見的方式
- Class 的 newInstance():反射方式,只能呼叫 public 修飾的空參的構造器
- Constructor 的 newInstance(args):反射方式,可以呼叫空參、帶參的構造器,許可權沒有要求
- 使用 clone():不呼叫任何構造器,當前類需要實現 cloneable() 介面
- 使用反序列化
- 第三方庫:Objenesis 等
2. 物件建立流程:
- 類載入器首先判斷當前物件的類是否載入、連結、初始化
- 為物件分配記憶體
- 處理併發安全問題:如果開啟了TLAB且TLAB足夠分配,直接在 TLAB 分配記憶體,否則採用 CAS機制保證更新的原子性
- 初始化分配到的空間:所有屬性設定預設值
- 設定物件的物件頭
- 執行物件的 init 方法:初始化程式碼塊,執行構造器
3. 物件的訪問定位:物件的訪問方式有兩種,基於控制代碼的方式和直接指標的方式
- 基於控制代碼的方式:堆中額外開闢出一個控制代碼池,控制代碼池中的每一個控制代碼都與堆中的一個物件相關聯,棧引用控制代碼池中的控制代碼從而間接引用物件,這種好處是堆在發生壓縮整理時只改變控制代碼就可以,棧中的引用不需要變動,壞處是發生了兩次引用
- 直接指標的方式:棧直接引用對中的物件,少了一次引用過程,但是堆在發生整理壓縮時需要修改棧中的引用指標