JVM验证 - 何时执行



我想知道 JVM 中的验证器究竟会在什么情况下启动并检查该类。我知道一个这样的实例是当您加载类时,但有时加载类并稍后进行验证。这就是为什么我想知道这种情况何时发生。

规范 (§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

最新更新