Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
启动java应用程序时使用-noverify_Java_Command Line Arguments - Fatal编程技术网

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

启动java应用程序时使用-noverify,java,command-line-arguments,Java,Command Line Arguments,我见过许多应用程序采用instrument类,并在加载时将-javaagent作为参数,还将-noverify放在命令行中 Java文档说-noverify关闭类验证 然而,为什么有人要关闭验证,即使他们正在检测类?启动时间,我会说。加载类时,验证类是否正确需要一些时间。由于类可能以惰性方式加载(不是在应用程序启动时加载,而是在第一次使用时加载),这可能会导致意外和不希望的运行时延迟 实际上,该类通常不需要检查。编译器不会发出任何无效的字节码或类构造。进行验证的原因是,该类可能构建在一个系统上,

我见过许多应用程序采用instrument类,并在加载时将
-javaagent
作为参数,还将
-noverify
放在命令行中

Java文档说
-noverify
关闭类验证


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

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


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

启动时间曾经是一个小问题。然而,验证器现在更快了,处理器也更快了。默认情况下,使用JDK6JavaC编译的代码将包含额外的信息,以加快验证器的运行速度。Apache Harmony只是使用了一种更快的验证算法


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

调试!事实上,这就是我现在正在做的,我是如何偶然发现这个问题的。在Terracotta,我们进行了大量字节码插装,有时在调试类适配器时关闭验证器会有所帮助,这样我们就可以看到它们在运行时失败的确切位置


您是对的,我们希望验证程序在生产中保持打开状态。

在不使用
-noverify的情况下使用JRebel将在启动时发出以下警告:

JRebel:“-noverify”丢失,将不会启用更改/添加/删除构造函数


因此,似乎
-noverify
允许字节码重新插装来完成一些本来不可能完成的事情。

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


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

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

看看这个:

以及相关的错误报告:

如果有人在2013+年对这个答案感到疑惑,请检查Arian的答案,因为这个答案不正确@帕维尔我的回答没有错。仅仅因为存在另一个原因为什么禁用字节码检查是一个好主意,并不意味着答案可能不那么正确。SpringLoad只是一个现有的JavaAgent,仅仅因为它可能产生无效字节码并不意味着所有JavaAgent都会产生无效字节码,因为没有JVM在接收无效字节码时必须正常工作,这就是为什么世界上大多数软件只产生有效字节码,使Arian的论点无效。不要误解我的意思-您已经很好地解释了
noverify
是如何工作的,以及为什么它可以加速类加载。然而,关于它与
javaagent
的连接,问题非常具体。你是说,例如,JRebel在每本集成手册中使用这个JVM参数仅仅是为了性能?问题也不是关于JRebel或SpringLoad,那么它与为什么JRebel或SpringLoad使用它有什么关联呢?