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

Debugging 在调试模式下运行JVM的副作用,debugging,jvm,release-management,Debugging,Jvm,Release Management,我想在调试模式下实现Java应用程序,以便在客户端出现随机或难以重现的问题时进行更轻松的调试 然而,我想了解一下这样做的潜在副作用?从JavaHotSpot文档来看,似乎有 从链接 全速调试 Java热点VM现在使用 全速调试。以前 调试完成时VM的版本 启用时,使用 只有翻译。现在,全部 热点的性能优势 技术可用于程序, 即使是编译代码。改进的 性能允许长时间运行 使程序更容易调试。 它还允许在以下时间进行测试: 全速。一旦出现 异常情况下,调试器将以 对代码源的完全可见性 这是否准确,或者是

我想在调试模式下实现Java应用程序,以便在客户端出现随机或难以重现的问题时进行更轻松的调试

然而,我想了解一下这样做的潜在副作用?从JavaHotSpot文档来看,似乎有

从链接

全速调试

Java热点VM现在使用 全速调试。以前 调试完成时VM的版本 启用时,使用 只有翻译。现在,全部 热点的性能优势 技术可用于程序, 即使是编译代码。改进的 性能允许长时间运行 使程序更容易调试。 它还允许在以下时间进行测试: 全速。一旦出现 异常情况下,调试器将以 对代码源的完全可见性

这是否准确,或者是否存在隐藏的警告,内存占用情况如何,以及在使用调试模式时是否存在任何其他隐藏的问题


P.P.PS:我从AMD中发现,我最初怀疑Origala的原始文章没有显示完整的故事。

< P>我不能为热点说话,也不会正式针对IBM,但我会说,当然有法律上的优化是不可能完全撤销的,如果在中间需要反编译,因此,在可能使用的生产JVM中请求调试时,不会启用


设想一种情况,优化器发现程序的一部分可以证明是不需要的,并且根据各种语言规则(包括JSR133)可以合法删除,JVM将希望删除它。其中一个问题是调试:删除代码对于单步执行代码的人来说很奇怪(变量不更新,单步执行时可能不会在行上停止),因此在这些情况下,选择禁用所述优化。对于堆栈分配对象等选项也可能如此。。因此,虽然JVM说它是“全速”的,但实际上更接近“接近全速,有些更有趣的选项无法完全撤销”。

如果您计划在启用远程调试的情况下运行应用程序,它也会影响安全性。远程调试使您的计算机上的端口保持打开状态,通过连接端口,我可以对您的应用程序执行各种有趣的操作。

该程序肯定不仅仅是在调试模式下运行,因此性能显然不可能相同。然而,如果您仔细阅读该声明,它会说新版本可以运行完全优化的代码,即使在调试模式下,这在以前是不可能的。因此,新的jvm比以前的jvm快得多,以前的jvm只能在解释模式下运行,没有优化。

这个问题很老,但在我搜索离开后对性能的影响时出现了-agentlib:jdwp。。。打开,但未进行积极调试

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

在Java6(ish)之前,您使用了-Xdebug,这有一定的影响,它关闭了JIT

在Java6中,他们将其更改为-agentlib并使其更好。虽然存在一些bug,但确实会导致性能下降。以下是针对openjdk的一个bug,我猜oracle/sun版本也存在类似的问题:

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

看起来,至少在openjdk中,这些bug是由Java7清除的。在那之后,我没有看到任何关于性能影响的东西

如果您进一步研究这一点并发现负面结果,请注意测试所使用的java版本——我所看到的一切都是指7之前的版本


我很想知道最近有没有人在启用端口的情况下在虚拟机中遇到性能问题。

您在Java HotSpot网站上读到了哪些内容,这些内容导致您从另一个链接得出不应该有性能惩罚的结论“全速调试Java HotSpot VM现在使用全速调试。在以前版本的VM中,当启用调试时,程序仅使用解释器执行。现在,HotSpot技术的全部性能优势可用于程序,即使是编译代码。改进的性能使长时间运行的程序更容易调试。它还允许以全速进行测试。一旦出现异常,调试器将在代码源完全可见的情况下启动(你能在非调试模式下强制禁用优化吗?或者相反,在调试模式下强制禁用优化,这样我们在两种模式下的行为都是等价的吗?对不起,我不知道热点的答案。从J9中我可以看到,没有支持的方法来禁用某些选项(或者确切的列表是什么)。不,您不能在调试模式下启用不安全的状态-当出现非法状态时,JVM将在您身上燃烧,我们不希望出现这种情况!如果您进行远程调试,这是正确的,但除此之外,它不是case@hhafez是的,这就是为什么我写了“如果您计划在启用远程调试的情况下运行应用程序”: