首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 物件建立全流程深度解析:從類載入到構造器執行

     編輯:Java 綜合教學

物件建立的六大關鍵步驟

在 JVM 中,一個普通 Java 物件(不含數組、Class 物件)的誕生經歷以下嚴格順序:

  1. 類載入檢查:虛擬機遇到 new 指令,先檢查常數池中是否有該類的符號引用,並確認該類已被載入、解析、初始化。若未載入,觸發雙親委派模型載入類。
  2. 記憶體分配:在堆中劃分一塊大小確定的記憶體區域。分配方式取決於堆是否規整:
    • 指標碰撞:Serial、ParNew 等壓縮型收集器,記憶體規整,移動指標。
    • 空閒列表:CMS 等標記-清除收集器,記憶體不連續,維護列表。
    並發安全處理:CAS 失敗重試、TLAB(Thread Local Allocation Buffer)優先在執行緒私有緩衝區分配。
  3. 初始化零值:將分配的記憶體空間(不含物件頭)設為零值:基本型別 0/false,引用型別 null。若使用 TLAB,此步驟可提前至分配時完成。
  4. 設定物件頭:填充物件頭:哈希碼、GC 分代年齡、鎖狀態標誌、執行緒持有的鎖、偏向執行緒 ID、偏向時間戳、類元資料指標(指向方法區的類資訊)、陣列長度(若為陣列)。
  5. 執行 <init> 方法(構造器):按程式碼順序執行:
    1. 父類構造器(隱式或顯式 super())
    2. 非靜態欄位初始化、非靜態初始化塊(按聲明順序)
    3. 本類構造器程式碼

記憶體佈局圖解

+------------------+
|   Object Header  |  <- Mark Word (哈希、鎖、GC 年齡等) + Klass Pointer (類元資料指標)
+------------------+
|   Instance Data  |  <- 非靜態欄位(含父類欄位),按分配策略排列
+------------------+
|   Padding        |  <- 對齊填充(8 字節倍數)
+------------------+

關鍵細節補充

  • final 欄位:在構造器結束前必須賦值,JMM 保證構造器完成前對其他執行緒不可見(禁止指令重排)。
  • 逸出:構造器中 this 引用若外洩(註冊監聽器、啟動執行緒),可能導致其他執行緒看到未完全初始化的物件。
  • 標量替換:JIT 編譯器逃逸分析後,若物件未逸出,可拆解為標量在棧上分配,甚至消除同步鎖。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved