一、簡介
Java類加載過程是面試中常問的問題之一,今天我們將對類加載的各個過程進行簡單的分析和總結,這樣在面試的時候對這個問題就有信心回答好了。
二、類加載過程
Java類加載過程包含下面5個步驟:
【a】加載
- 通過一個類的全限定名獲取該類的二進制流;
- 將該二進制流的靜態存儲結構轉化爲方法區運行時數據結構;
- 在內存中生成該類的Class對象,作爲該類的數據訪問入口;
【b】鏈接
鏈接階段又可以分爲驗證、準備和解析三個階段。
- 驗證: 驗證的目的是爲了確保Class文件的字節流中的信息不會危害到虛擬機;
- 文件格式驗證 :驗證字節流是否符合Class文件的規範,如主次版本號是否在當前虛擬機範圍內,常量池中的常量是否有不被支持的類型等等;
- 元數據驗證 :對字節碼描述的信息進行語義分析,如這個類是否有父類,是否繼承了不被繼承的類等等;
- 字節碼驗證 :通過驗證數據流和控制流的分析,確定程序語義是否正確,主要針對方法體的驗證。如:方法中的類型轉換是否正確,跳轉指令是否正確等等;
- 符號引用驗證 :爲了確保解析動作能正確執行;
- 準備: 準備階段是爲類的靜態變量分配內存並將其初始化爲默認值,這些內存都將在方法區中進行分配。準備階段不分配類中的實例變量的內存,實例變量將會在對象實例化時隨着對象一起分配在Java堆中。
//在準備階段value初始值爲0,在初始化階段纔會變爲123
public static int value = 123
//注意下面是常量, 在準備階段之後,number 的值將是 3,而不是 0
public static final int number = 3;
- 解析: 主要完成符號引用到直接引用的轉換動作。解析動作並不一定在初始化動作完成之前,也有可能在初始化之後。
【c】初始化
- 初始化是類加載的最後一步,真正開始執行類中定義的Java程序代碼;
【d】使用
- 當 JVM 完成初始化階段之後,JVM 便開始從入口方法開始執行用戶的程序代碼;
【e】卸載
- 當用戶程序代碼執行完畢後,JVM 便開始銷燬創建的 Class 對象,最後負責運行的 JVM 也退出內存;
三、類加載器的雙親委派模型機制?
參考回答:當一個類收到了類加載的請求,首先自己並不會去加載這個類,而是將其委派到父類加載器,由父類去加載,如果此時父類無法加載,反饋給子類加載器,子類加載器再嘗試去加載。