用一張思惟導圖儘量囊括一下JVM的類加載過程的全流程。java
本文參考自來自周志明《深刻理解Java虛擬機(第2版)》,拓展內容建議讀者能夠閱讀下這本書。
文字版以下:數組
經過類的全限定名來獲取定義此類的二進制字節流數據結構
數組類的加載,不禁類加載器建立,而是由JVM直接在內部建立多線程
文件格式驗證:字節流是否符合Class文件格式規範佈局
元數據驗證:字節碼描述的信息進行語義分析編碼
類中字段、方法是否與父類產生矛盾spa
字節碼驗證:經過數據流和控制流分析程序語義的合法性,即類的方法體的校驗分析線程
符號引用驗證:類的常量池中各類符號引用的信息進行匹配性校驗指針
文件格式驗證:字節流是否符合Class文件格式規範對象
元數據驗證:字節碼描述的信息進行語義分析
類中字段、方法是否與父類產生矛盾
字節碼驗證:經過數據流和控制流分析程序語義的合法性,即類的方法體的校驗分析
符號引用驗證:類的常量池中各類符號引用的信息進行匹配性校驗
實際上就是把常量池中的符號引用替換爲直接引用的過程
符號引用
在常量池中即非字面量的類型
特徵
直接引用
表達形式
特徵
符號引用解析
類或接口的解析
對CONSTANT_Class_info符號引用的解析
虛擬機加載類D中的類符號引用N爲一個類或接口C的直接引用
C不是數組類型
C是數組類型
虛擬機將N表明的全限定名(如[Ljava.lang.Integer)傳遞給D的類加載器來加載C(詳見數組類加載流程)
字段解析
對CONSTANT_Fieldref_info符號引用的解析
虛擬機在類D中加載字段符號引用N爲字段F的直接引用
虛擬機在N中指定的類C裏尋找字段描述符和N中指定的字段描述符一致的字段F
能找到,就將符號引用N替換爲F的直接引用
找不到,在類C實現的接口中按照繼承關係從下向上尋找字段描述符和N中指定的字段描述符一致的字段F
能找到就將符號引用N替換爲F的直接引用
找不到,在類C繼承的父類中按照繼承關係從下向上尋找字段描述符和N中指定的字段描述符一致的字段F
能找到就將符號引用N替換爲F的直接引用
類方法解析
對CONSTANT_Methodref_info符號引用的解析
虛擬機在類D中加載類方法符號引用N爲方法M的直接引用
虛擬機在N中指定的類C裏尋找方法描述符和N中指定的方法描述符一致的方法M
能找到
找不到,在類C繼承的父類中按照繼承關係從下向上尋找方法描述符和N中指定的方法描述符一致的方法M
能找到就將符號引用N替換爲M的直接引用
找不到,在類C實現的接口中按照繼承關係從下向上尋找方法描述符和N中指定的方法描述符一致的方法M
接口方法解析
對CONSTANT_InterfaceMethodref_info符號引用的解析
虛擬機在類D中加載接口方法符號引用N爲方法M的直接引用
虛擬機在N中指定的接口C裏尋找方法描述符和N中指定的方法描述符一致的方法M
能找到
找不到,在接口C繼承的父接口中按照繼承關係從下向上尋找方法描述符和N中指定的方法描述符一致的方法M