用一张思惟导图尽量囊括一下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