为什么 JVM 具有最大内联深度?
java
具有一个参数(默认值为 9),该参数控制对内联的最大嵌套调用数。为什么会有这样的限制?为什么基于频率和代码大小的通常试探法不足以让JVM自己决定内联的深度?-XX:MaxInlineLevel
(这是由JitWatch提示的,它向我展示了由于深度原因,深嵌套的番石榴呼叫没有被内联)checkArgument
java
具有一个参数(默认值为 9),该参数控制对内联的最大嵌套调用数。为什么会有这样的限制?为什么基于频率和代码大小的通常试探法不足以让JVM自己决定内联的深度?-XX:MaxInlineLevel
(这是由JitWatch提示的,它向我展示了由于深度原因,深嵌套的番石榴呼叫没有被内联)checkArgument
一些重要的搜索发现了这个有趣的小片段(我实际上得到了谷歌搜索的第4页):
if (inline_depth() > MaxInlineLevel) {
return "inlining too deep";
}
if (method() == callee_method
&& inline_depth() > MaxRecursiveInlineLevel) {
return "recursively inlining too deep";
}
这表明,正如预期的那样,在停止内联之前,你对你走多深是一个硬性限制。它还表明,仅指直接递归调用,而不是突变递归调用,例如调用 .MaxInlineLevel
MaxRecursiveInlineLevel
foo()
bar()
foo()
所以我认为我的猜测评论是正确的 - 是为了防止相互递归,因为要检测您需要保留对内联调用堆栈的完整深度的引用。MaxInlineLevel
MaxInlineResursionLevel
控制调用内联。foo()
foo()
请注意,引用的代码可能不是真正的 JVM。
@apangin的评论从Open JDK 8中找到了一个更现代的热点版本,这表明它现在不再像那样简单。看起来整个堆栈正在搜索递归调用,因此现在也可能阻止相互递归。MaxRecursiveInlineLevel