虚拟机类加载机制
2020-06-23 20:36:53 28 举报
AI智能生成
虚拟机类加载机制
作者其他创作
大纲/内容
什么是类加载
加载什么
加载class文件,无论以何种形式存在,只要是符合条件的二进制字节流
磁盘文件
网络传输
etc
为什么需要类加载
class文件只有被加载才能使用
啥时候进行类加载
运行期间
类加载分几步,不一定严格按照顺序
1.加载
1.1 通过类的全限定名获取此类的二进制字节流 B
1.2 将B的静态存储结构转化为方法区的运行时数据结构
1.3 在内存中生成一个代表这个类的java.lang.Class对象,此对象作为1.2中运行时数据结构的访问入口
结果:B以虚拟机所需的格式存储在方法区中
连接
2.验证
验证B是否符合要求,没有恶意代码损害JVM
2.1 文件格式验证,要符合class文件格式要求,见https://www.processon.com/mindmap/5d458174e4b01ed2c6ac2cd3
2.2 元数据验证,即语义分析
比如此类是否有父类
如果此类不是抽象类,那是否实现了父类或者接口中要求实现的方法
类的字段和方法是否与父类矛盾
2.3 字节码验证,通过数据流和控制流分析,确定程序运行期间不会对JVM有害
2.4 符号引用验证
比如,这个全限定名字符串代表的类 C 能否被找到
找到了这个类 C,那C的字段和方法是否符合B中所描述的那样
或者,字段和方法能否被B访问,比如private,public等等
3.准备
为static变量在方法区中分配内存并初始化,注意3点
1.不包括实例变量,实例变量将在对象实例化时随着对象一起分配在堆中
2.通常情况下,初始化为零值,比如public static int value = 123,
在准备阶段后的初始值为0,而123这个值是在程序编译后由类构造器中赋的
在准备阶段后的初始值为0,而123这个值是在程序编译后由类构造器中赋的
3.特殊情况下,当字段的字段属性表里存在ConstantValue属性时,则初始化为此属性的值
如:public static final int value = 123,则在准备阶段后的初始值为123
如:public static final int value = 123,则在准备阶段后的初始值为123
4.解析
把常量池中的符号引用替换为直接引用
类或接口的解析
字段解析
类方法解析
接口方法解析
解析发生的时机:执行操作符号引用的字节码指令之前,对其使用的符号引用进行解析
ps:
符号引用:用符号描述所引用的目标,符号可以是任何形式的字面量。
与JVM内存布局无关,目标不一定已经在内存中。
与JVM内存布局无关,目标不一定已经在内存中。
直接引用:直接指向目标的指针、相对偏移量、句柄等
与JVM内存布局相关,目标必然已经在内存中
与JVM内存布局相关,目标必然已经在内存中
总之,符号引用就像是:我要引用一个名叫a,类型为A的目标。
而直接引用:这个目标在内存单元0x5A3,见
https://www.zhihu.com/question/30300585/answer/51313752
而直接引用:这个目标在内存单元0x5A3,见
https://www.zhihu.com/question/30300585/answer/51313752
5.初始化
真正执行类中定义的Java程序代码
6.使用
7.卸载
类加载器
以下接口、类统称为类
0 条评论
下一页