我想在调试模式下重新发布Java应用程序,以便在客户端随机或难以重现问题时更容易调试。
但是,我想要了解这样做的潜在副作用?从Java HotSpot文档中可以看出should be no performance penalty。
从链接
全速调试
Java HotSpot VM现在使用 全速调试。在以前 调试时的VM版本 启用后,程序执行使用 只有翻译。现在,完整 HotSpot的性能优势 技术可用于程序, 即使是已编译的代码。改进了 性能允许长时间运行 程序更容易调试。 它还允许进行测试 全速。一旦有了 异常,调试器启动时 完全了解代码源。
这是准确的还是有隐藏的警告,内存占用情况如何,使用调试模式时还有其他隐藏的问题。
PS:我发现AMD的this article证实了我最初怀疑oricale的原始文章没有显示完整的故事。答案 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快得多,后者只能在没有优化的解释模式下运行。