java虚拟机类加载过程(精简版)

java虚拟机类加载过程步骤:

    1.加载

将虚拟机外部的二进制字节流存储到方法区中:

a.获取此类二进制流:

通过一个类的全限定名来获取定义此类的二进制流;

b.数据结构转化:

将字节流所代表的静态存储结构转化为方法区的运行时数据结构;

c.生成类对象:

在内存中生成一个代表这个类的Java.lang.class对象,作为这个类在方法区的各种数据的访问接口;

2.验证

确保class文件字节流中包含的信息符合当前虚拟机的要求,不会危害虚拟机自身安全;

a.文件格式验证:

是否以魔数开头;

版本号是否在虚拟机处理范围内;

常量池中是否有不支持的常量类型;

Class文件是否被附加其他信息;......

b.元数据验证:(对数据类型校验)

是否有父类;

父类是否能继承;

类中字段和方法是否与父类产生矛盾;

c.字节码验证:(对方法体校验)

通过数据流与控制流分析确定程序语义是合法的;

保证操作栈的数据类型与指令代码能配合工作;

保证跳转指令正确跳转;

保证方法体中类型转换有效;

d.符号引用验证:

确保解析动作能正常执行;

3.准备

为类变量分配内存;

设置初始值;

类变量所使用的内存在方法区中分配

4.解析

虚拟机将常量池中的符号引用替换成直接引用;

符号引用(Symbolic References):符号引用以一组符号来描述索引用的目标;

直接引用(Direct References):直接引用可以是直接指向目标的指针、相对偏移量或是一个能间接定位到目标的句柄;

主要针对1类或接口,2字段,3类方法,4接口方法,5方法类型,6方法句柄,7调用点限定符,7类符号引用进行;

5.初始化

到初始化阶段,才开始执行类中定义的Java程序代码;

根据程序员通过程序制定的主观计划去初始化类变量和其它内容;

初始化阶段是执行类构造器的过程;


猜你喜欢

转载自blog.csdn.net/robot_tdh/article/details/78906394