代码之家  ›  专栏  ›  技术社区  ›  hhafez

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

  •  21
  • hhafez  · 技术社区  · 14 年前

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

    从链接

    全速调试

    全速调试。在以前 调试时VM的版本 启用时,使用 只有翻译。现在,全部 技术可用于程序, 即使是编译过的代码。改进的 性能允许长时间运行 它还允许测试在 异常,调试器启动时 对代码源的完全可见性。

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

    PS:我找到了 this article

    4 回复  |  直到 5 年前
        1
  •  16
  •   Trent Gray-Donald    14 年前

    我不能代表HotSpot,也不会正式代表IBM,但我要说的是,如果在其中需要反编译,那么肯定有一些合法的优化不可能完全撤销,因此在您可能使用的生产jvm中要求调试时,这些优化是不启用的。

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

        2
  •  5
  •   Bill K    5 年前

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

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

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

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

    我很想知道是否有人遇到性能问题,在最近的虚拟机刚刚离开港口启用。

        3
  •  4
  •   Hila    14 年前

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

        4
  •  1
  •   Hemang    14 年前