1. JVM介紹和運行流程-CSDN博客
2. 什么是程序計數器-CSDN博客
3. java 堆和 JVM 內存結構-CSDN博客
4. 虛擬機棧-CSDN博客
5. JVM 的方法區-CSDN博客
6. JVM直接內存-CSDN博客
7. JVM類加載器與雙親委派模型-CSDN博客
8. JVM類裝載的執行過程-CSDN博客
9. JVM垃圾回收-CSDN博客
10. 垃圾回收的算法-CSDN博客
11. JVM中的分代回收-CSDN博客
12. JVM的垃圾回收器-CSDN博客
13. G1垃圾回收器-CSDN博客
14. 垃圾回收的引用區別-CSDN博客
15. JVM調優的參數設置-CSDN博客
16. JVM調優工具-CSDN博客
1.?JVM類裝載
類裝載(Class Loading)是Java虛擬機(JVM)將類的字節碼文件(.class文件)加載到內存,并對數據進行校驗、轉換解析和初始化,最終形成可以被JVM直接使用的Java類型的過程。
這是Java程序運行的基礎機制,也是實現Java"一次編寫,到處運行"特性的關鍵環節。
類裝載的核心目標是:
-
將類的二進制數據讀入內存
-
將靜態存儲結構轉換為運行時數據結構
-
生成對應的Class對象作為訪問入口
-
確保加載的類安全有效
2.?類裝載的生命周期?
類從加載到虛擬機中開始,直到卸載為止,它的整個生命周期包括了:加載、驗證、準備、解析、初始化、使用和卸載這7個階段。
其中,驗證、準備和解析這三個部分統稱為連接(linking)?
1. 加載(Loading)
-
任務:查找并加載類的二進制數據
-
過程:
-
通過類的全限定名獲取類的二進制字節流
-
將字節流代表的靜態存儲結構轉換為方法區的運行時數據結構
-
在堆中生成一個代表該類的Class對象,作為方法區數據的訪問入口
-
-
特點:
-
數組類由JVM直接創建,不通過類加載器
-
非數組類的加載可以通過內置或自定義的類加載器完成
-
2. 驗證(Verification)
-
目的:確保Class文件的字節流符合JVM規范,不會危害虛擬機安全
-
驗證內容:
-
文件格式驗證(魔數、版本號等)
-
元數據驗證(語義分析)
-
字節碼驗證(程序邏輯驗證)
-
符號引用驗證(常量池中的引用檢查)
-
3. 準備(Preparation)
-
任務:為類變量分配內存并設置初始值
-
特點:
-
只分配類變量(static變量),不包括實例變量
-
初始值通常是數據類型的零值(如0、0L、null、false等)
-
對final static常量會直接賦程序指定的值
-
4. 解析(Resolution)
-
任務:將常量池中的符號引用替換為直接引用
-
解析類型:
-
類或接口的解析
-
字段解析
-
方法解析
-
接口方法解析
-
-
特點:
-
解析可能在初始化之后才進行(動態綁定)
-
如果解析失敗會拋出NoSuchMethodError等錯誤
-
5. 初始化(Initialization)
-
任務:執行類構造器
<clinit>()
方法 -
過程:
-
按順序執行靜態變量賦值和靜態代碼塊
-
保證父類的
<clinit>()
先于子類執行 -
接口的
<clinit>()
不需要先執行父接口的
-
-
觸發條件(以下情況必須立即初始化):
-
使用new、getstatic、putstatic或invokestatic指令時
-
反射調用類時
-
初始化子類發現父類未初始化時
-
虛擬機啟動時指定的主類
-
使用動態語言支持時相關方法句柄對應的類未初始化
-
<clinit>()
方法詳解
<clinit>()
是Java編譯器自動生成的類構造器方法(Class Constructor Method),它負責執行類的初始化工作。這個特殊的方法名稱中的"clinit"是"class initialization"的縮寫。
自動生成:
由編譯器自動收集類中的所有靜態變量賦值語句和靜態代碼塊(static{}塊)合并產生
如果沒有靜態變量賦值或靜態代碼塊,編譯器不會生成
<clinit>()
方法執行順序:
父類的
<clinit>()
先于子類執行靜態變量和靜態代碼塊按源代碼中的出現順序執行
接口的
<clinit>()
不需要先執行父接口的(除非使用父接口的變量)線程安全:
JVM會保證一個類的
<clinit>()
方法在多線程環境下被正確地加鎖同步如果一個線程正在執行
<clinit>()
,其他線程會阻塞等待
6. 使用(Using)
-
類完成初始化后進入使用階段
-
可以創建實例、調用方法、訪問字段等
7. 卸載(Unloading)
-
條件:
-
類的所有實例都已被回收
-
加載該類的ClassLoader已被回收
-
對應的Class對象沒有被引用
-
-
特點:
-
由JVM的垃圾回收器完成
-
卸載通常發生在方法區(元空間)垃圾回收時
-
由啟動類加載器加載的類通常不會被卸載
-
3. 總結
類裝載的執行過程?
- 加載:查找和導入class文件
- 驗證:保證加載類的準確性
- 準備:為類變量分配內存并設置類變量初始值
- 解析:把類中的符號引用轉換為直接引用
- 初始化:對類的靜態變量,靜態代碼塊執行初始化操作
- 使用:JVM 開始從入口方法開始執行用戶的程序代碼
- 卸載:當用戶程序代碼執行完畢后,JM便開始銷毀創建的Class對象。