46

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

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

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

4

6 回答 6

47

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

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

于 2008-11-19T00:20:37.783 回答
47

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

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

于 2012-12-04T20:03:24.267 回答
5

调试!事实上,这就是我现在正在做的事情,以及我是如何偶然发现这个问题的。在 Terracotta,我们做了很多字节码检测,有时在调试类适配器时关闭验证器会有所帮助,这样我们就可以看到它们在运行时到底在哪里失败。

你说得对,我们希望验证器继续投入生产。

于 2008-12-01T21:17:07.667 回答
5

不使用 JRebel-noverify将在启动时发出此警告:

JRebel:缺少“-noverify”,将无法启用更改/添加/删除构造函数!

因此,似乎-noverify允许字节码重新检测来做一些原本不可能的事情。

于 2011-07-29T12:12:34.397 回答
3

启动时间曾经是一个问题。但是,验证器现在更快,处理器也更快。默认情况下,使用 JDK6 javac 编译的代码将包含额外信息以加快验证程序步骤。Apache Harmony 只是使用了更快的验证算法。

一些非常旧的 javac 版本产生了不正确的字节码。实际上,Sun 插件仍然包含修复代码,以验证某些损坏的类文件。

于 2008-11-19T15:25:07.440 回答
2

JAVA 6 中引入的新验证器对于代码操作的处理非常复杂。

看看这个: http ://chrononsystems.com/blog/java-7-design-flaw-leads-to-huge-backward-step-for-the-jvm

以及相关的错误报告: http ://bugs.sun.com/view_bug.do?bug_id=8009595

于 2013-11-19T17:32:12.743 回答