每天学一点:java虚拟机9

类型的声明周期
所有java虚拟机必须实现在每个类或者接口首次主动使用时初始化。以下六种情形符合主动使用要求:
1、创建某个类的新实例;
2、调用某个类的静态方法,即在字节码中执行invokestatic指令时;
3、使用某个类或者接口的静态字段,或者对静态字段赋值(在字节码中执行getstatic、putstatic指令)。用final修士的静态字段除外,他被初始化为一个编译时的常量表达式;
4、调用某些反射方法时;
5、初始化某个类的子类;
6、虚拟机起动时某个被标明为启动类的类(含main()方法的类);

只有在某个接口所声明的非常量字段被使用时,该接口才会被初始化;

装载:
三个基本动作,要装载一个类型,java虚拟机必须:
1、通过该类型的完全限定名,产生一个代表该类的二进制数据流;
2、解析这个二进制数据流为方法区内的内部数据结构;
3、创建一个表示该类型的java.lang.Class 类的实例;

如果一个类装载器在预先装载时遇到缺失或者错误的class文件,它必须等到程序首次主动使用该类时才报告错误。

验证:
虚拟机在装载的时候要检查每个类的超类(object类之外)是否已经被加载。
1、各类之间二进制兼容的检查:
    1.1 final类不能拥有子类;
1.2 final方法不能被覆盖;
1.3 确保类型和超类之间没有不兼容的方法声明;
1.4 检查所有常量池入口相互之间一致;
1.5 检查常量池中的所有特殊字符串(类名、字段名、方法名、字段描述符、方法描述符)是否符合格式;
1.6 字节码的完整性;
在连接过程中一次性验证字节码流,而非在程序执行的时候动态验证,提高了java程序的运行速度;

猜你喜欢

转载自baoxiaofei.iteye.com/blog/2273785