【问题标题】:Hotspot JIT optimization and "de-optimization": how to force FASTEST?Hotspot JIT优化与“去优化”:如何强制FASTEST?
【发布时间】:2011-08-01 09:10:04
【问题描述】:

我有一个正在尝试优化的大型应用程序。 为此,我通过在循环中运行数百万次并检查它们的处理时间来分析/基准测试其中的小元素。

很明显,Hotspot 的 JIT 正在发挥作用,而我实际上可以看到这种情况何时发生。 我喜欢它,我可以清楚地看到“热身”期后事情进展得更快。

但是,在达到最快的执行速度并保持一段时间后,我可以看到速度降低到不那么令人印象深刻的速度,并保持在那里。

在循环中执行的内容实际上并没有太大变化,所以我很难理解为什么逃逸分析会强制代码“去优化”。

基本上,我感觉 JIT 正在获得最佳性能,然后适应较慢的东西,认为它“足够了”。

有什么方法可以告诉他“这还不够,我真的希望代码尽可能快地运行!”。 我知道它可以做到。我怎么能强迫它这样做呢?

【问题讨论】:

  • 你能提供任何证据支持你的观察吗?
  • 听起来您对 JVM / JIT 的工作方式有一些模糊的迷信感觉,现在您想根据这种感觉进行微优化。与其专注于微优化,不如使用分析器运行程序,找出瓶颈,然后首先专注于在相关位置使用更高效的算法。
  • 也许是垃圾收集器在您的应用程序运行一段时间后变得更忙,导致您的代码运行速度变慢?您可以尝试找到一种减少内存消耗的方法,看看是否有效果。

标签: java optimization compiler-construction jvm jit


【解决方案1】:

不可能用“产品”(阅读正常发布)构建进行跟踪,我会将代码放入 yourkit 并查看发生了什么,热点将始终尝试获得最佳优化。

如果您的代码在 jit 中强制取消优化,它只会变得更慢,在分析器中,您应该能够将其视为大量分配、大量异常之类的事情。

【讨论】:

  • 我不确定。在 Eclipse 中,当我运行应用程序并使用 VisualVM 启动器时,VisualVM 有大量关于正在发生的事情的信息。
  • 我的意思是,你可以在分析器中看到昂贵的代码;但更难看出你是否被 jit 优化了。
【解决方案2】:

您应该使用VisualVM 来查找JDK 附带的内存泄漏和CPU 使用问题。它非常适合分析,并且有很多插件。您还可以在应用程序运行时自动启动 VisualVM from Eclipse。 Netbeans 可能有类似的东西。如果您使用采样而不是分析,它也不会对性能产生太大影响。

我过去更喜欢 JRockIt Mission Control(使用 JRockIt VM),但现在它可以胜任。

【讨论】:

    猜你喜欢
    • 2021-05-06
    • 2015-05-01
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多