面試題之請描述一下Java類加載過程

一、簡介

Java類加載過程是面試中常問的問題之一,今天我們將對類加載的各個過程進行簡單的分析和總結,這樣在面試的時候對這個問題就有信心回答好了。

二、類加載過程

Java類加載過程包含下面5個步驟:

【a】加載

  • 通過一個類的全限定名獲取該類的二進制流;
  • 將該二進制流的靜態存儲結構轉化爲方法區運行時數據結構;
  • 在內存中生成該類的Class對象,作爲該類的數據訪問入口;

【b】鏈接

鏈接階段又可以分爲驗證、準備和解析三個階段。

  • 驗證: 驗證的目的是爲了確保Class文件的字節流中的信息不會危害到虛擬機;
  1. 文件格式驗證 :驗證字節流是否符合Class文件的規範,如主次版本號是否在當前虛擬機範圍內,常量池中的常量是否有不被支持的類型等等;
  2. 元數據驗證 :對字節碼描述的信息進行語義分析,如這個類是否有父類,是否繼承了不被繼承的類等等;
  3. 字節碼驗證 :通過驗證數據流和控制流的分析,確定程序語義是否正確,主要針對方法體的驗證。如:方法中的類型轉換是否正確,跳轉指令是否正確等等;
  4. 符號引用驗證 :爲了確保解析動作能正確執行;
  • 準備: 準備階段是爲類的靜態變量分配內存並將其初始化爲默認值,這些內存都將在方法區中進行分配。準備階段不分配類中的實例變量的內存,實例變量將會在對象實例化時隨着對象一起分配在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 也退出內存;

三、類加載器的雙親委派模型機制?

參考回答:當一個類收到了類加載的請求,首先自己並不會去加載這個類,而是將其委派到父類加載器,由父類去加載,如果此時父類無法加載,反饋給子類加載器,子類加載器再嘗試去加載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章