对于HotSpot JIT,“已编译成大方法”是什么意思?

时间:2015-07-06 16:36:50

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

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

  

已经编译成一个大方法

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

来自Oracle维基的这个解释没有让我得出任何结论:

  

已经编译成一个大方法:已经编译好了代码   对于从调用站点调用的方法和代码   生成的for大于InlineSmallCode

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

1 个答案:

答案 0 :(得分:4)

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

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

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

  1. 调用a()内联
  2. 现在a()本身已经过优化,它内联对b()的调用,使其本机代码大小大于InlineSmallCode
  3. 后续对a()的调用不会内联
  4. 根据你的内联日志,也许你可以查看这个理论。