1. 程式人生 > >JAVA面試——類加載機制

JAVA面試——類加載機制

static 所表 類變量 loader eth 字節碼 常量池 圖片 靜態語句塊

  • 生命周期包括:加載、連接(驗證、準備、解析)、初始化、使用、卸載
  • 類初始化:
    • 遇到new、getstatic、putstatic、invokestatic四條字節碼指令時;常見場景:使用new實例化對象,讀取或設置一個類的靜態字段、調用一個類的靜態方法
    • 使用java.lang.reflect包的方法對類進行反射調用
    • 初始化類時,父類沒有初始化
    • 虛擬機啟動,用戶指定一個要執行的主類,主類沒有初始化
    • java.lang.invoke.MethodHandle實例解析結果為REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,句柄對應的類沒有初始化
  • 加載階段需要完成3件事:
    • 通過一個類的全限定名來獲取定義此類的二進制字節流
    • 將這個字節流所表示的靜態存儲結構轉化為方法區的運行時數據結構
    • 在內存中生成一個代表此類的java.lang.Class對象,作為方法區這個類的各種數據訪問入口
  • 驗證:
    • 確保Class文件的字節流包含的信息符合虛擬機要求
    • 文件格式驗證:保證輸入字節流可以正確解析並存儲於方法區內
    • 元數據驗證:對元數據信息進行語義校驗,保證不存在不符合JAVA語言規範的元數據信息
    • 字節碼驗證:對方法體進行校驗分析
    • 符號引用驗證:符號引用轉化為直接引用
  • 準備
    • 為類變量分配內存(方法區)並設置變量初始值
  • 解析
    • 將常量池中的符號引用替換為直接引用
  • 初始化
    • 執行類構造器<clinit>()方法的過程
    • <clinit>()方法是由編譯器自動收集類中的所有變量的賦值動作和靜態語句塊中的語句合並產生的
  • 類加載器:
    • 通過一個類的全限定名來獲取描述此類的二進制字節流(JAVA虛擬機外)
    • 加載器分類:
      • 啟動類加載器
        • C++實現,是虛擬機自身一部分
      • 所有其他的類加載器
        • Java語言實現,獨立於虛擬機外部,繼承自抽象類java.lang.ClassLoader
    • 按照層次劃分:
      • 啟動類加載器
      • 擴展類加載器
      • 應用程序類加載器
      • 技術分享圖片
    • 類加載的雙親委派模型
      • 工作流程

JAVA面試——類加載機制