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