在调试模式下运行JVM的副作用

时间:2010-09-16 00:22:13

标签: debugging jvm release-management

我想在调试模式下重新发布Java应用程序,以便在客户端随机或难以重现问题时更容易调试。

但是,我想要了解这样做的潜在副作用?从Java HotSpot文档中可以看出should be no performance penalty

从链接

  

全速调试

     

Java HotSpot VM现在使用   全速调试。在以前   调试时的VM版本   启用后,程序执行使用   只有翻译。现在,完整   HotSpot的性能优势   技术可用于程序,   即使是已编译的代码。改进了   性能允许长时间运行   程序更容易调试。   它还允许进行测试   全速。一旦有了   异常,调试器启动时   完全了解代码源。

这是准确的还是有隐藏的警告,内存占用情况如何,使用调试模式时还有其他隐藏的问题。

PS:我发现AMD的this article证实了我最初怀疑oricale的原始文章没有显示完整的故事。

4 个答案:

答案 0 :(得分:16)

我不能代表HotSpot,也不会正式代表IBM,但我会说,如果在它们中间需要反编译,那么肯定有合法的优化是不可能完全撤消的,并且因此,在您可能使用的生产JVM中要求调试时,不会启用它。

想象一下,优化程序发现程序的一部分可能不是必需的,并且各种语言规则(包括JSR 133)是合法的删除,JVM将希望摆脱它。一个问题是调试:删除代码看起来很奇怪人类踩过它(变量没有更新,可能不会在步进时停在行上)所以选择是在这些情况下禁用所述优化。对于像堆栈分配的对象等opts也是如此。所以当JVM说它是“全速”时,它实际上更接近“几乎全速,一些无法完全删除的有趣的选择”

答案 1 :(得分:2)

如果您计划在启用远程调试的情况下运行应用程序,它也会影响安​​全性。远程调试会在您的计算机上打开一个端口,通过连接它,我可以为您的应用程序做各种有趣的事情。

答案 2 :(得分:2)

这个问题已经过时了,但是如果你只是留下-agentlib:jdwp ...而不是主动调试,我会在搜索任何性能影响时出现。

摘要:从调试选项开始但不连接不应该影响现在的速度(Java 7 +)。

TL / DR:

在java 6(ish)之前你使用了-Xdebug并且这有一定的影响,它关闭了JIT!

在java 6中,他们将其更改为-agentlib并使其更好。虽然有一些错误确实会导致性能下降。这是针对openjdk提出的错误之一,我的猜测是oracle / sun版本存在类似的问题:https://bugs.openjdk.java.net/browse/JDK-6902182

但请注意,所述目标是仅通过打开端口启用调试不应导致任何性能损失。

看起来,至少在openjdk中,java 7清理了错误。之后我没有看到任何关于性能影响的内容。

如果你进一步研究并找到负面结果,请注意测试完成的java版本 - 我看到的所有内容都是指7之前的版本。

我很想知道是否有人在刚刚启用端口的情况下遇到性能问题。

答案 3 :(得分:1)

该程序绝对不仅仅是在调试模式下运行,因此很明显性能不能相同。但是,如果您仔细阅读该声明,则表示即使处于先前无法实现的调试模式,新版本也可以运行完全优化的代码。因此,新的jvm比之前的jvm快得多,后者只能在没有优化的解释模式下运行。