jvm 類裝載器
class 裝載、認證流程
- 加載
- 加載類的第一階段
- 取得二進制流
- 轉爲方法區的數據結構
- 在Java堆中生成對應的java.lang.Class對象
- 鏈接
- 驗證
- 目的:保證Class流的格式是正確的
- 文件格式的驗證
- 是否以0xCAFEBABE開頭
- 版本號是否合理
- 元數據的驗證
- 是否有父類
- 是否繼承了final類
- 非抽象類實現了所有的抽象方法
- 字節碼的驗證(很複雜)
- 運行檢查
- 棧數據類型的和操作數據參數吻合
- 跳轉指令制定到合理的位置
- 符號引用驗證
- 常量池中描述類是否存在
- 訪問的方法或字段是否存在且有足夠的權限
- 文件格式的驗證
- 目的:保證Class流的格式是正確的
- 準備
- 分配內存,併爲類設置初始值(方法區中)
- 解析
- 符號引用替換爲直接引用
- 驗證
- 初始化
- 執行類構造器
- 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
- 查看已經加載的ClassLoader(自下而上)
打破常規模式
熱替換
- 含義
- 當一個class被替換後,系統無需重啓,替換的類立即生效
- 問題:java.lang.NoSuchFieldException 可能在什麼階段拋出
- 本身就沒有該Field;
- 有該Field,但是該Field是使用private修飾的,而在獲取該Field的時候,需要使用getDeclaredField這個方法。
自己在學習jvm時自己總結的一些知識點,如果哪裏不正確,歡迎指正。