我想在调试模式下发布一个Java应用程序,以便在客户端随机或难以重现问题时更容易调试。
但是,我想要了解这样做的潜在副作用?从Java HotSpot文档看来,有should be no performance penalty。
从链接
全速调试
Java HotSpot VM现在使用全速调试。在以前版本的VM中,启用调试时,程序仅使用解释程序执行。现在,即使使用已编译的代码,HotSpot技术的全部性能优势也可用于程序。性能的提高使得长时间运行的程序更容易调试。它还允许测试以全速进行。一旦出现异常,调试器就会启动代码源的完全可见性。
这是准确的还是有隐藏的警告,内存占用情况如何,使用调试模式时还有其他隐藏的问题。
PS:我发现来自AND的qazxsw poi证实了我最初的怀疑,即来自oricale的原始文章没有显示完整的故事。
我不能代表HotSpot,并且不会正式代表IBM,但我会说,如果在它们中间需要反编译,那么肯定有合法的优化是不可能完全撤消的,因此不是'在您可能使用的生产JVM中要求调试时启用。
想象一下,优化器发现程序的一部分可能不是必需的情况,并且各种语言规则(包括JSR 133)合法删除,JVM将希望摆脱它。一个问题是调试:删除代码看起来很奇怪人类踩过它(变量没有更新,可能不会在步进时停在行上)所以选择是在这些情况下禁用所述优化。对于像堆栈分配的对象等opts也是如此。所以当JVM说它是“全速”时,它实际上更接近“几乎全速,一些无法完全删除的有趣的选择” 。
如果您计划在启用远程调试的情况下运行应用程序,它也会影响安全性。远程调试会在您的计算机上打开一个端口,通过连接它,我可以使用您的应用程序执行各种有趣的操作。
这个问题很老,但是当我在寻找任何性能影响时,如果你只是留下-agentlib:jdwp ... on但是没有主动调试。
简介:从调试选项开始但不连接不应该影响现在的速度(Java 7+)。
在java 6(ish)之前你使用-Xdebug并且这有一定的影响,它关闭了JIT!
在java 6中,他们将其更改为-agentlib并使其更好。虽然有一些错误确实会导致性能下降。这是针对openjdk提出的错误之一,我的猜测是oracle / sun版本存在类似的问题:this article
但请注意,所述目标是通过打开端口简单地启用调试不应导致任何性能损失。
看起来,至少在openjdk中,java 7清理了错误。之后我没有看到任何有关性能影响的信息。
如果你进一步研究并找到负面结果,请注意测试完成的java版本 - 我看到的所有内容都是指7之前的版本。
我很想知道是否有人在最近的VM中遇到了性能问题,只是启用了端口。
该程序绝对不仅仅是在调试模式下运行,因此很明显性能不能相同。但是,如果您仔细阅读该声明,则表示即使处于先前无法实现的调试模式,新版本也可以运行完全优化的代码。因此,新的jvm比之前的jvm快得多,后者只能在没有优化的解释模式下运行。