1. 程式人生 > 其它 >物件例項化記憶體佈局與訪問定位

物件例項化記憶體佈局與訪問定位

1. 建立物件的方式:

  • new:使用new 關鍵字建立物件,最常見的方式
  • Class 的 newInstance():反射方式,只能呼叫 public 修飾的空參的構造器
  • Constructor 的 newInstance(args):反射方式,可以呼叫空參、帶參的構造器,許可權沒有要求
  • 使用 clone():不呼叫任何構造器,當前類需要實現 cloneable() 介面
  • 使用反序列化
  • 第三方庫:Objenesis 等

2. 物件建立流程:

  • 類載入器首先判斷當前物件的類是否載入、連結、初始化
  • 為物件分配記憶體
  • 處理併發安全問題:如果開啟了TLAB且TLAB足夠分配,直接在 TLAB 分配記憶體,否則採用 CAS機制保證更新的原子性
  • 初始化分配到的空間:所有屬性設定預設值
  • 設定物件的物件頭
  • 執行物件的 init 方法:初始化程式碼塊,執行構造器

3. 物件的訪問定位:物件的訪問方式有兩種,基於控制代碼的方式和直接指標的方式

  • 基於控制代碼的方式:堆中額外開闢出一個控制代碼池,控制代碼池中的每一個控制代碼都與堆中的一個物件相關聯,棧引用控制代碼池中的控制代碼從而間接引用物件,這種好處是堆在發生壓縮整理時只改變控制代碼就可以,棧中的引用不需要變動,壞處是發生了兩次引用
  • 直接指標的方式:棧直接引用對中的物件,少了一次引用過程,但是堆在發生整理壓縮時需要修改棧中的引用指標