jvm 類裝載器

jvm 類裝載器


class 裝載、認證流程

  • 加載
    • 加載類的第一階段
    • 取得二進制流
    • 轉爲方法區的數據結構
    • 在Java堆中生成對應的java.lang.Class對象
  • 鏈接
    • 驗證
      • 目的:保證Class流的格式是正確的
        • 文件格式的驗證
          • 是否以0xCAFEBABE開頭
          • 版本號是否合理
        • 元數據的驗證
          • 是否有父類
          • 是否繼承了final類
          • 非抽象類實現了所有的抽象方法
        • 字節碼的驗證(很複雜)
          • 運行檢查
          • 棧數據類型的和操作數據參數吻合
          • 跳轉指令制定到合理的位置
        • 符號引用驗證
          • 常量池中描述類是否存在
          • 訪問的方法或字段是否存在且有足夠的權限
    • 準備
      • 分配內存,併爲類設置初始值(方法區中)
    • 解析
      • 符號引用替換爲直接引用
  • 初始化
    • 執行類構造器
      • static變量賦值語句
      • static{}語句
    • 子類的調用前保證父類的先被調用
    • 是線程安全的

什麼是類裝載器 ClassLoader

  • ClassLoader是一個抽象類
  • ClassLoader實例將讀入java字節碼將類裝載到jvm中
  • ClassLoader可以定製,滿足不同字節碼流獲取方式
  • ClassLoader負責類裝載過程中的 加載階段

JDK中ClassLoader默認的設計模式

  • ClassLoader分類
    • Bootstrap ClassLoader 啓動ClassLoader
    • Extension ClassLoader 擴展ClassLoader
    • App ClassLoader 系統/應用ClassLoader
    • Custom ClassLoader 自定義ClassLoader
  • 協同工作
    • 查看已經加載的ClassLoader(自下而上)
      • Custom ClassLoader -》 App ClassLoader -》 Extension ClassLoader -》 Bootstrap ClassLoader
    • 嘗試加載ClassLoader(自上而下)
      • Custom ClassLoader -《 App ClassLoader 《- Extension ClassLoader 《- Bootstrap ClassLoader

打破常規模式

熱替換

  • 含義
    • 當一個class被替換後,系統無需重啓,替換的類立即生效

  • 問題:java.lang.NoSuchFieldException 可能在什麼階段拋出
    1. 本身就沒有該Field;
    2. 有該Field,但是該Field是使用private修飾的,而在獲取該Field的時候,需要使用getDeclaredField這個方法。

    自己在學習jvm時自己總結的一些知識點,如果哪裏不正確,歡迎指正。

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