一、概述
JVM(Java Virtual Machine)在運行 Java 程序時,需要將 .class
字節碼文件加載到內存中,并轉換成可以被 JVM 執行的數據結構,這一過程就是 類加載過程(Class Loading Process)。
JVM 的類加載機制具備高度靈活性與可擴展性,支持自定義類加載器,且類的生命周期分為以下幾個階段:
二、類的生命周期階段
- 加載(Loading)
- 驗證(Verification)
- 準備(Preparation)
- 解析(Resolution)
- 初始化(Initialization)
- (可選)使用(Using)
- (可選)卸載(Unloading)
前五個階段屬于 類加載的過程,使用和卸載屬于類的生命周期的后期階段。
三、類加載的五個階段詳解
1. 加載(Loading)
作用:
將 .class
文件的字節碼從磁盤或網絡加載到 JVM 內存中,并生成一個 Class
對象。
步驟:
- 通過類的全限定名查找
.class
文件。 - 讀取字節流。
- 將字節流轉換成內存中的數據結構。
- 創建
java.lang.Class
類的實例。
說明:
- 使用 類加載器(ClassLoader) 完成。
- 可以自定義類加載器實現特殊的加載邏輯。
2. 驗證(Verification)
作用:
確保字節碼文件的正確性與安全性,不會破壞 JVM 的穩定性。
主要檢查:
- 文件格式驗證(魔數、版本號等)
- 元數據驗證(類結構正確性)
- 字節碼驗證(操作碼合法性、棧操作正確性)
- 符號引用驗證(類和方法是否存在)
3. 準備(Preparation)
作用:
為類的 靜態變量 分配內存,并初始化默認值(不包括靜態代碼塊和顯式賦值)。
特點:
- 所有靜態變量初始化為零值(數值為0,對象為null,boolean為false)。
- 不執行任何 Java 代碼。
- 這一步只是內存分配與默認值初始化。
示例:
public class Demo {static int a = 10;
}
在準備階段,a
的值是 0
,真正賦值為 10 的過程發生在 初始化階段。
4. 解析(Resolution)
作用:
將常量池中的 符號引用 轉換為 直接引用。
解析內容:
- 類或接口的符號引用 → 直接引用
- 字段符號引用 → 直接引用
- 方法符號引用 → 直接引用
- 接口方法引用 → 直接引用
說明:
- 并非必須立即解析,可在運行時動態解析(延遲解析)。
- 也可由 JVM 實現決定是否在加載時解析。
5. 初始化(Initialization)
作用:
執行類構造器 <clinit>()
方法,對靜態變量進行顯式賦值和執行靜態代碼塊。
執行條件:
- 創建類的實例
- 訪問類的靜態變量或靜態方法
- 反射調用 Class.forName()
- 初始化類的子類時,其父類會被先初始化
- JVM 啟動時指定的主類(含 main 方法)
注意:
- 每個類只會初始化一次。
- 父類先于子類初始化。
四、類加載器(ClassLoader)
類加載器的類型
名稱 | 說明 |
---|---|
Bootstrap ClassLoader(啟動類加載器) | 加載 java.* 核心類庫(由 C++ 實現,非 Java 類) |
Extension ClassLoader(擴展類加載器) | 加載 ext 目錄下的類(如 jre/lib/ext ) |
Application ClassLoader(系統類加載器) | 加載應用類路徑(classpath)下的類 |
自定義類加載器 | 用戶可以繼承 ClassLoader 實現自己的加載邏輯 |
雙親委派模型(Parent Delegation Model)
工作流程:
- 當前類加載器收到加載請求。
- 委派給父類加載器。
- 父類加載器繼續向上委托,直到 Bootstrap ClassLoader。
- 若父加載器無法加載,再由當前加載器嘗試加載。
優點:
- 避免類的重復加載。
- 保證核心類安全性(如 java.lang.String 永遠由啟動類加載器加載)。
五、類的卸載(Unloading)
條件:
- 該類的
Class
對象沒有任何引用。 - 加載該類的類加載器沒有任何引用。
- JVM 才能卸載該類。
說明:
- 卸載的前提是類加載器無引用,通常發生在動態部署的模塊或插件系統中。
- 主動卸載需要結合自定義類加載器。
六、類加載過程圖解
┌────────────┐│ .class 文件 │└────┬───────┘↓┌────────────┐│ 加載 Loading│└────┬───────┘↓┌───────────────────┐│ 驗證 Verification │└────┬──────────────┘↓┌────────────────┐│ 準備 Preparation│└────┬───────────┘↓┌──────────────┐│ 解析 Resolution│└────┬─────────┘↓┌─────────────────────┐│ 初始化 Initialization│└─────────────────────┘