我已经看到许多应用程序采用仪器类,并-javaagent
在加载时将其作为参数放入-noverify
命令行.
Java doc说,-noverify
关闭了类验证.
然而,为什么有人想要关闭验证,即使他们正在检测课程?
当它与-javaagent
它一起使用时,很可能不是出于性能原因,而是因为代理故意创建"无效"字节码.
应该注意的是,无效字节码可能仍然可以正常执行,因为一些验证规则非常严格.例如,this
在调用超级构造函数之前,不能在构造函数中访问它,因为此时变量未初始化.但是仍然可能还有其他事情要做(参见JRebel示例).然后,您-noverify
用来规避该规则.
启动时间,我会说.在加载类时,验证类是否正确需要一些时间.由于类可能以惰性方式加载(不是在应用程序启动时加载,而是在第一次使用时),这可能会导致意外和不希望的运行时延迟.
实际上这个课程一般不需要检查.编译器不会发出任何无效的字节码或类构造.验证的原因是该类可以构建在一个系统上,在线托管并通过未受保护的互联网传输给您.在此路径上,恶意攻击者可能会修改字节码并创建编译器可能永远不会创建的内容; 可能导致JVM崩溃或可能绕过安全限制的东西.因此,在使用之前验证该类.如果这是本地应用程序,通常不需要再次检查字节码.
调试!事实上,这就是我现在正在做的事情,以及我如何偶然发现这个问题.在Terracotta我们做了很多字节码检测,有时它会在我们调试类适配器时关闭验证器,因此我们可以看到它们在运行时的确切位置.
你是对的,我们希望验证者继续留在生产中.