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程序代码;
根据程序员通过程序制定的主观计划去初始化类变量和其它内容;
初始化阶段是执行类构造器的过程;