【问题标题】:For the HotSpot JIT, what does "already compiled into a big method" mean?对于HotSpot JIT,“已经编译成大方法”是什么意思?
【发布时间】:2015-09-23 21:54:58
【问题描述】:

我正在查看 JIT HotSpot 编译器日志 (-XX:+PrintCompilation -XX:+UnlockDiagnosticVMOptions -XX:+PrintInlining) 以确保正在优化/编译重要/热门方法。方法显示:

已经编译成大方法

这是什么意思?我的方法是否被 JIT 正确优化/内联?

来自 Oracle wiki 的解释并没有让我得出任何结论:

已经编译成大方法:已经有编译代码 对于从调用站点调用的方法和之前的代码 生成的大于 InlineSmallCode

这是什么意思?这是否意味着我的代码已经过优化/内联,或者 HotSpot 现在正在跳过它,因为它是在其他地方编译的?

【问题讨论】:

  • 热点的诊断信息见wikis.oracle.com/display/HotSpotInternals/…。你看过这个文档吗?
  • @wero 我已经看到了,但不幸的是它并没有让我得出任何结论。那是什么意思?这是否意味着我的代码已优化/内联,或者 HotSpot 现在正在跳过它,因为它是在其他地方编译的?
  • 代码是内联,当它很小并且可以替换而不是调用函数时......请查看有关Java Bytecode的资源分析喜欢这个播客:podcastchart.com/podcasts/webobjects-podcasts/episodes/…
  • @LatencyGuy:对我来说,您的方法没有被内联,因为它的编译大小超过了 InlineSmallCode 的阈值大小。你可以为你的方法验证这一点吗?
  • @wero 在其他地方被内联了。我在日志中看到hot (inlined),但在其他地方也看到already compiled into a big method使用相同的方法。难道是我的方法的调用者之一太大,因此它不包括我的热方法?

标签: java optimization real-time jit jvm-hotspot


【解决方案1】:

查看hotspot source(搜索“已经编译成大方法”)很明显,如果内联的候选方法已经编译成本机代码并且本机代码大小超过阈值 InlineSmallCode(即取决于平台,可以通过 -XX:InlineSmallCode=n 设置。因此,此消息不依赖于调用者。

怎么可能 - 正如您所评论的那样 - 方法 a() 有时是内联的,有时不是(带有消息“已经编译成一个大方法”)?

一种可能的解释是 a() 调用了另一个方法 b() 并且优化运行如下:

  1. 对 a() 的调用是内联的
  2. 现在 a() 本身已经过优化,它内联了对 b() 的调用,使其本机代码大小大于 InlineSmallCode
  3. 随后对 a() 的调用不会被内联

也许你可以根据你的内联日志检查这个理论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多