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

Lat*_*Guy 5 java optimization jit real-time jvm-hotspot

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

已经编译成一个大方法

这意味着什么?JIT是否正确优化/内联了我的方法?

Oracle Wiki的这种解释并没有使我得出任何结论:

已经编译成一个大方法:已经有从调用站点调用的方法的已编译代码,并且为其生成的代码大于InlineSmallCode

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

wer*_*ero 5

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

就像您评论的那样,怎么可能有时内联而不是内联方法a()(并显示消息“已编译为大方法”)?

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

  1. 内联对a()的调用
  2. 现在,a()本身已进行了优化,并且内联了对b()的调用,从而使其本机代码大小大于InlineSmallCode
  3. 然后不内联对a()的后续调用

鉴于您的内联日志,也许您可​​以检查这一理论。