gpt4 book ai didi

java - 使用-XX :-UseSplitVerifier?有多安全

转载 作者:IT老高 更新时间:2023-10-28 20:33:24 28 4
gpt4 key购买 nike

使用检测的 JDK7 编译代码存在已知的兼容性问题。至于http://www.oracle.com/technetwork/java/javase/compatibility-417013.html

Classfiles with version number 51 are exclusively verified using the type-checking verifier, and thus the methods must have StackMapTable attributes when appropriate. For classfiles with version 50, the Hotspot JVM would (and continues to) failover to the type-inferencing verifier if the stackmaps in the file were missing or incorrect. This failover behavior does not occur for classfiles with version 51 (the default version for Java SE 7). Any tool that modifies bytecode in a version 51 classfile must be sure to update the stackmap information to be consistent with the bytecode in order to pass verification.

解决方案是使用 -XX:-UseSplitVerifier 总结如下: https://community.oracle.com/blogs/fabriziogiudici/2012/05/07/understanding-subtle-new-behaviours-jdk-7

它有多安全?我想甲骨文把这个检查放在里面是有原因的。如果我不使用它,我可能会冒其他问题的风险。

使用 -XX:-UseSplitVerifier 会有什么后果?

谢谢,

彼得。

最佳答案

简而言之,它非常安全。

从 Java 6 开始,Oracle 的编译器使用 StackMapTable 制作类文件。基本思想是编译器可以显式指定对象的类型,而不是让运行时来做。这在运行时提供了微小的加速,以换取编译期间的一些额外时间和编译的类文件(前面提到的 StackMapTable)的一些复杂性。

作为一项实验性功能,它在 Java 6 编译器中默认未启用。如果不存在 StackMapTable,则运行时默认验证对象类型本身。

直到 Java 7。Oracle 强制要求:编译器生成它们,运行时验证它们。如果 StackMapTable 不存在,它仍然使用旧的 validator ......但仅限于 Java 6 或更早版本(版本 50)的类文件。使用 StackMapTable 需要 Java 7 类文件(版本 51),因此运行时不会对它们进行同样的处理。

如果您的类文件是在没有 StackMapTable 的情况下生成的,那么这只是一个问题。例如,如果您使用的是非 Oracle JVM。或者,如果你后来弄乱了字节码——比如将其与调试器、优化器或代码覆盖分析器一起使用。

但你可以绕过它! Oracle 的 JVM 提供了 -XX:+UseSplitVerifier 来强制运行时回退到旧的类型 validator 。它不关心 StackMapTable。

在实践中,对运行速度和效率的期望优化并没有实现:如果存在,还不足以让任何人注意到。由于新类型 validator 不提供任何新功能(只是优化),因此将其关闭是非常安全的。

Oracle 的解释位于 http://www.oracle.com/technetwork/java/javase/compatibility-417013.html如果您搜索 JSR 202。

关于java - 使用-XX :-UseSplitVerifier?有多安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15253173/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com