我正在浏览JIT HotSpot编译器日志(-XX:+PrintCompilation -XX:+UnlockDiagnosticVMOptions -XX:+PrintInlining
)以确保正在优化/编译重要/热方法。该方法显示:
已经编译成一个大方法
这是什么意思?我的方法是否被JIT正确优化/内联?
来自Oracle维基的这个解释没有让我得出任何结论:
已经编译成一个大方法:已经编译好了代码 对于从调用站点调用的方法和代码 生成的for大于InlineSmallCode
这是什么意思?这是否意味着我的代码已经过优化/内联,或者HotSpot现在正在跳过它,因为它是在其他地方编译的?
答案 0 :(得分:4)
查看hotspot source(搜索"已编译成大方法")很明显,如果内联的候选方法已编译为本机代码和本机代码,则会显示该消息大小超过阈值InlineSmallCode(它取决于平台,可以通过-XX设置:InlineSmallCode = n)。因此,此消息不依赖于调用者。
怎么可能 - 正如你评论的那样 - 方法a()有时是内联的,有时不是(带有消息"已经编译成一个大方法")
一种可能的解释是a()调用另一个方法b(),优化运行如下:
根据你的内联日志,也许你可以查看这个理论。