Old*_*eon 12
一些重要的搜索揭示了这个有趣的小片段(我实际上已经到了谷歌搜索的第4页):
if (inline_depth() > MaxInlineLevel) {
return "inlining too deep";
}
if (method() == callee_method
&& inline_depth() > MaxRecursiveInlineLevel) {
return "recursively inlining too deep";
}
Run Code Online (Sandbox Code Playgroud)
这表明,MaxInlineLevel
在您停止内联之前,对您的深度的预期是一个很大的限制.它还建议MaxRecursiveInlineLevel
只引用直接递归调用,而不是调用递归调用,如foo()
调用bar()
调用foo()
.
所以我认为我的猜测是正确的 - MaxInlineLevel
是为了防止相互递归,因为检测到你需要保持对内联调用堆栈的完整深度的引用.
MaxInlineResursionLevel
控制内联foo()
调用foo()
.
请注意,引用的代码可能不是真正的JVM.
@apangin的评论从Open JDK 8中找到一个更现代的热点版本,这表明它现在不再像那样简单了.看起来整个堆栈都在搜索递归调用,因此现在也可以阻止相互递归过去MaxRecursiveInlineLevel
.