1.加载
在加载阶段 虚拟机完成三件事
1.通过一个类的全限定名来获取定义此类的二进制字节流
2.将这个字节流所代表的静态存储结构转化为方法区运行时的数据结构
3.在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据访问出口
2.验证
直接决定了Java虚拟机是否能承受恶意代码的攻击,从执行性能角度上讲,验证阶段的工作量在虚拟机的类加载子系统中又占了一部分
1.文件格式的验证
要验证字节流是否符合Class文件格式的规范,并且能被当前版本的虚拟机处理。
2.元数据验证
对字节码描述的信息进行语义分析,保证其描述的信息符合Java语言规范的要求
3.字节码验证
主要目的是通过数据流和控制流分析,确定语义是合法的、符合逻辑的。
4.符号引用验证
引用符号可以看做是对类自身以外的信息匹配教验。
3.准备
准备阶段是正式为类变量分配内存并设置类变量初始值(通常情况下是数据类型的零值)的阶段,这些变量所使用的内存都将在方法区中进行分配。这时候进行内存分配的仅包括类变量(被static修饰的变量),而不包括实例变量,实例变量将会在对象实例化的时候随着对象一起分配在Java堆中。
4.解析
解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程
1.类或接口的解析
2.字段解析
3.类方法解析
4.接口方法解析
5.初始化
在准备阶段,便用已经赋过一次系统要求的初始值,而在初始化阶段,则根据程序员通过程序制定的主观计划去初始化类变量和其他资源。也就是说 初始化是执行类构造器<clinit>()方法的过程
参考《深入理解Java虚拟机》
网友评论