1.加载
准确地说,是加载阶段中,获取类的二进制字节流的动作
2.验证
验证主要是验证检查class文件的字节流中是否符合当前虚拟机规范要求,并且不会危害虚拟机自身安全
验证包括:文件格式验证,元数据验证,字节码验证和符号引用验证
文件验证的主要目的是保证输入的字节流能正确地解析并存储于方法区之内,格式上符合描述一个java类型信息的要求
元数据验证对字节码描述信息进行语义分析,保证符合java规范要求
字节码验证:进行字节流和控制流分析
符号引用验证是对类自身以外(常量池中的各种符号引用)的信息进行匹配性校验。它的目的是确保解析动作能正常执行
3.准备
准备阶段是类变量(static修饰的变量)分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配。
注意:首先这时候进行内存分配仅包括类变量(static修饰的变量),而不包括实例变量,实例变量将会在对象实例化时,随着对象一起分配在java堆中。
其次,这里所说的初始值“通常情况下”是数据类型的零值。例如:
public static int value=123;
那么变量value在准备阶段过后的初始值为0,而不是123,因为这时候尚未开始执行任何java方法,而把value赋值为123的putstatic指令是程序编译后,存于类构造器
()方法之中,所以把value赋值为123的动作将在初始化阶段才会执行。
如果定义为:public static final int value=123; 编译时将会为value生成ConstantValue属性,在准备阶段就会根据ConstantValue将value设置为 123
4.解析
解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。
解析动作主要包括:类或接口,字段,类方法,接口方法四类符号引用进行解析。
5.类初始化
初始化阶段,是真正执行类中定义的java程序代码(或者说字节码)。在准备阶段,变量已经赋过一次系统要求的初始值,而在初始化阶段,则是根据程序员通过程序制定的主观计划去初始化类变量和其他资源。或者说,初始化阶段是执行类构造器()方法的过程。
阅读(722) | 评论(0) | 转发(0) |