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

JVM 類加載機制全解析:生命週期、雙親委派與初始化時機

     編輯:Java 綜合教學

JVM 類加載機制全解析:生命週期、雙親委派與初始化時機

一、 類加載完整生命週期(7 階段)

  1. 加載:獲取二進制字節流 → 轉換為方法區運行時數據結構 → 在堆生成 Class 對象。
  2. 驗證:文件格式、元數據、字節碼、符號引用四輪校驗,確保不危害 VM 安全。
  3. 準備:為 類變量 分配方法區內存,設置零值(非初始值)。
  4. 解析:將常量池符號引用替換為直接引用(類/接口、字段、方法、方法類型/句柄/調用點)。
  5. 初始化:執行類構造器 <clinit>()(靜態變量賦值、靜態代碼塊),此階段才真正執行 Java 代碼。
  6. 使用:應用程序通過 Class 對象訪問類。
  7. 卸載:類加載器被 GC 回收,類元數據隨之卸載。

驗證+準備+解析 = 連接階段。

二、 必須立即「初始化」的 5 大場景(JLS 強制規定)

  1. 遇到 new、getstatic、putstatic、invokestatic 字節碼指令(即 new 對象、讀/寫靜態字段、調用靜態方法)。
  2. 反射調用 Class.forName()、Method.invoke() 等。
  3. 初始化子類時,父類未初始化則先初始化父類。
  4. VM 啟動時指定的主類(含 main())。
  5. JDK 7+ MethodHandle/invokedynamic 涉及的類。

三、 類加載器與雙親委派模型

加載器實現語言加載範圍
啟動類加載器C++<JAVA_HOME>/lib、-Xbootclasspath 指定路徑
擴展類加載器Java<JAVA_HOME>/lib/ext、java.ext.dirs
應用程序類加載器JavaClasspath (-cp)

委派流程:子加載器收到請求 → 委派給父加載器 → 遞歸至啟動類加載器 → 父加載器無法加載(ClassNotFoundException) → 子加載器嘗試自行加載。

核心優勢:

  • 避免類重複加載(同一類只被加載一次)。
  • 保護核心 API 不被篡改(如無法自定義 java.lang.String)。

四、 類與加載器的唯一性判定

「類的完全限定名 + 定義它的加載器」共同確定類在 JVM 中的唯一性。不同加載器加載同名類互不相干(instanceof、Class.cast() 皆失效)。


深諳類加載機制,是排查 ClassNotFoundException/NoClassDefFoundError、實現熱部署、理解 SPI/模塊化系統的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved