noverify启动参数

amber 3年前 4,775次点击 来自 java

作用:关闭字节码校验
当 ClassLoader 加载的Java 字节码时,字节码首先接受校验器(verifier)的校验。校验器负责检查那些指令无法执行的明显的破坏性的操作。校验器执行的检查操作:
1、变量要在使用之前进行初始化。
2、方法调用与对象应用类型之间要匹配。
3、访问私有数据和方法的规则没有被违反。
4、对本地变量的访问都在运行时堆栈内。
5、运行时堆栈没有溢处。

Java选项-Xverify:none-noverify 在JDK13中不建议使用,使用时将产生以下警告。

warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release.
  • 答案1
    在加载类时,验证类是否正确需要一些时间。由于类可能以延迟方式加载(不是在app start上,而是在第一次使用时),这可能会导致意外的运行时延迟。
    实际上,类一般不需要检查。编译器不会发出任何无效的字节码或类构造。进行验证的原因是,该类可能构建在一个系统上,联机托管,并通过不受保护的internet传输给您。在这个路径上,恶意攻击者可能修改字节码并创建编译器可能永远不会创建的内容;可以使JVM崩溃或可能绕过安全限制的东西。因此,在使用类之前对其进行验证。如果这是一个本地应用程序,通常不需要再次检查字节码。

  • 答案2:
    当它与-javaagent一起使用时,它很可能不是出于性能原因,而是因为代理故意创建了“无效”字节码。
    应该注意的是,无效字节码可能仍然执行良好,因为一些验证规则非常严格。例如,在调用超级构造函数之前,不能在构造函数中访问此项,因为此时变量没有初始化。但是,您可能还需要做其他事情(请参阅JRebel示例)。然后,你用关闭校验器来规避这个规则。

  • 答案3:
    调试!在调试类适配器时关闭验证器会有所帮助,因此可以看到它们在运行时到底在哪里失败。

  • 答案4:
    6下编译的代码在高版本找那个执行经常需要关闭校验器。JAVA 6 以后校验器不是很兼容,启动时间曾经是一个问题。但是,现在验证程序和处理器的速度都更快。默认情况下,使用JDK6 javac编译的代码将包含其他信息,以使验证程序步骤更快。

参考:
https://stackoverflow.com/questions/300639/use-of-noverify-when-launching-java-apps
https://github.com/spring-projects/spring-loaded#readme
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8218003
http://rockhong.github.io/jvm-noverify.html

目前暂无回复

致力于搭建一个分享发现好玩东西的社区京ICP备15052899号-3

本站总访问量 | 本文总阅读量 | 本站总访客数