启动 Java 应用程序时使用 -noverify

2022-08-31 23:50:41

我见过许多应用程序在加载时将乐器类作为参数,也把a放到命令行。-javaagent-noverify

Java文档说这关闭了类验证。-noverify

但是,为什么有人想要关闭验证,即使他们正在检测类?


答案 1

当它与 结合使用时,它很可能不是出于性能原因,而是因为代理故意创建“无效”字节码。-javaagent

应该注意的是,无效的字节码可能仍然执行良好,因为一些验证规则非常严格。例如,在调用超构造函数之前,不得在构造函数中访问,因为此时未初始化变量。但是您可能仍然想做其他事情(请参阅JRebel示例)。然后,您用来规避该规则。this-noverify


答案 2

我会说,启动时间。加载类时,验证类是否正确需要一些时间。由于类可能以延迟方式加载(不是在应用启动时,而是在首次使用时),这可能会导致意外和不需要的运行时延迟。

实际上,该类通常不需要检查。编译器不会发出任何无效的字节码或类构造。验证的原因是该类可能构建在一个系统上,在线托管并通过未受保护的Internet传输给您。在此路径上,恶意攻击者可能会修改字节码并创建编译器可能永远不会创建的内容。可能会使JVM崩溃或可能规避安全限制的东西。因此,在使用类之前对其进行验证。如果这是本地应用程序,通常无需再次检查字节码。