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

2024-01-22

java有争论-XX:MaxInlineLevel(默认值为 9)它控制内联嵌套调用的最大数量。为什么会有这样的限制?为什么基于频率和代码大小的常见启发法不足以让 JVM 自行决定内联的深度?

(这是由JitWatch https://github.com/AdoptOpenJDK/jitwatch向我展示了一个嵌套很深的番石榴checkArgument由于深度原因,调用未被内联)


一些重要的搜索发现了这个有趣的小东西fragment https://searchcode.com/codesearch/view/12587414/(实际上我已经到了页面4谷歌搜索):

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

这表明MaxInlineLevel正如预期的那样,在停止内联之前,它是对深度的硬性限制。它还表明MaxRecursiveInlineLevel仅指直接递归调用,而不是相互递归调用,例如foo() calls bar()哪个调用foo().

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

MaxInlineResursionLevel控制foo() calls foo()内联。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 JVM 有最大内联深度? 的相关文章

随机推荐