假设我们有3种方法:方法2从方法1中调用,方法3由方法2调用.
方法2和3每个大小为30个字节码.另外,假设定义方法2总是从方法1调用一次,方法3总是从方法2调用一次.
方法2和3每个大小为30个字节码.另外,假设定义方法2总是从方法1调用一次,方法3总是从方法2调用一次.
如果方法2首先被内联,则方法3将从方法1的主体直接调用,并且可以轮流地内联.如果方法3首先插入到方法2中,则后者的大小将变为大约60个字节码,并且由于默认的MaxInlinesize阈值是35字节码,因此它不能被内联.
在哪个顺序HotSpot JIT内嵌方法:自顶向下还是从下到上?
解决方法
MaxInlinesize影响至少执行一次但小于MinInliningThreshold次的方法的编译.对于超过MinInliningThreshold执行的方法,存在一个不同的设置-XX:FreqInlinesize = …具有更大的(依赖于平台的)默认值.无论MaxInlinesize如何,热点仍然内联.您可以通过使用-XX运行应用程序来测试它:UnlockDiagnosticVMOptions -XX:PrintInlining -XX:MaxInlinesize = 0.它仍然会报告热点的内容(这些与评论“(热)”).只有以前报告的方法与“执行” MinInliningThreshold times“可能会使评论”太大“.如果您设置了FreqInlinesize,您可能会收到“热法太大”等评论.我从来没有看到他们的默认设置.