JVM验证 - 什么时候执行?

时间:2012-05-12 12:06:19

标签: java jvm

我想知道JVM中的验证程序在什么情况下会启动并检查类。我知道有一个这样的实例是在你加载类的时候,但是有时加载类并且稍后验证。这就是为什么我想要确切知道何时发生这种情况。

1 个答案:

答案 0 :(得分:0)

规范(§4.10)说明如下:

  

Java虚拟机实现验证每个类文件   满足连接时间的必要约束(§5.4)。

§5.4定义了“链接时间”的含义:

  

链接类或接口涉及验证和准备   类或接口,它的直接超类,它的直接超接口,   及其元素类型(如果是数组类型),如果需要的话。   类或接口中符号引用的解析是一个   链接的可选部分。

     

该规范允许实现灵活性   链接活动(并且,由于递归,加载)发生,   只要保留以下所有属性:

A class or interface is completely loaded before it is linked.

A class or interface is completely verified and prepared before it is initialized.

Errors detected during linkage are thrown at a point in the program where some action is taken by the program that might, directly
     

或间接地,需要链接到所涉及的类或接口   错误。

     

例如,Java虚拟机实现可以选择   单独解析类或接口中的每个符号引用   何时使用(“懒惰”或“迟”分辨率),或解决所有问题   当班级被验证时(“急切”或“静态”)   解析度)。这意味着解决过程可能会继续进行   一些实现,在初始化类或接口之后。   无论采用哪种策略,在解决过程中都会检测到任何错误   必须抛出程序中的某个点(直接或间接)   使用对类或接口的符号引用。

注意事实上至少Hotspot正在进行延迟初始化(如果JRockit和co做了其他事情,我会非常惊讶)。

来源:

http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.10

http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html#jvms-5.4