为什么 JVM 具有最大内联深度?

2022-09-02 01:54:08

java具有一个参数(默认值为 9),该参数控制对内联的最大嵌套调用数。为什么会有这样的限制?为什么基于频率和代码大小的通常试探法不足以让JVM自己决定内联的深度?-XX:MaxInlineLevel

(这是由JitWatch提示的,它向我展示了由于深度原因,深嵌套的番石榴呼叫没有被内联)checkArgument


答案 1

一些重要的搜索发现了这个有趣的小片段(我实际上得到了谷歌搜索的第4页):

    if (inline_depth() > MaxInlineLevel) {
        return "inlining too deep";
    }
    if (method() == callee_method
            && inline_depth() > MaxRecursiveInlineLevel) {
        return "recursively inlining too deep";
    }

这表明,正如预期的那样,在停止内联之前,你对你走多深是一个硬性限制。它还表明,仅指直接递归调用,而不是突变递归调用,例如调用 .MaxInlineLevelMaxRecursiveInlineLevelfoo()bar()foo()

所以我认为我的猜测评论是正确的 - 是为了防止相互递归,因为要检测您需要保留对内联调用堆栈的完整深度的引用。MaxInlineLevel

MaxInlineResursionLevel控制调用内联。foo()foo()

请注意,引用的代码可能不是真正的 JVM。

@apangin的评论从Open JDK 8中找到了一个更现代的热点版本,这表明它现在不再像那样简单。看起来整个堆栈正在搜索递归调用,因此现在也可能阻止相互递归。MaxRecursiveInlineLevel


答案 2

推荐