java
有一个参数-XX:MaxInlineLevel
(默认值为9),该参数控制对内联的嵌套调用的最大数量。为什么会有这样的限制?为什么基于频率和代码大小的常规启发式方法不足以使JVM自行决定内联的深度?
(这是由JitWatch提示的,向我显示了checkArgument
由于深度而未内嵌深层嵌套的Guava
调用)
一些重要的搜索发现了这个有趣的小片段(我实际上到达了Google搜索的第
4 页):
if (inline_depth() > MaxInlineLevel) {
return "inlining too deep";
}
if (method() == callee_method
&& inline_depth() > MaxRecursiveInlineLevel) {
return "recursively inlining too deep";
}
这表明,MaxInlineLevel
按预期的那样,硬限制是您停止内联之前的深度。这也表明,MaxRecursiveInlineLevel
仅指直接递归调用,而不是mutal递归调用,如foo()
调用bar()
哪个电话foo()
。
因此,我认为我的猜测是正确的- MaxInlineLevel
防止 相互 递归,因为要检测到您需要保留对内联调用堆栈的整个深度的引用。
MaxInlineResursionLevel
控制foo()
调用foo()
内联。
请注意,引用的代码可能不是真实的JVM。
@apangin的评论找到了来自Open JDK
8的更现代版本的热点,这表明如今它不再如此简单。似乎在整个堆栈中搜索递归调用,因此现在也可能阻止相互递归MaxRecursiveInlineLevel
。
问题内容: Python具有最大的递归深度,但没有最大的迭代深度。为什么限制递归?像迭代一样对待递归而不限制递归调用的数量会更自然吗? 让我只说这个问题的根源在于尝试实现流。例如,假设我们要编写一个流以产生自然数: 流的递归定义非常吸引人。但是,我想更好/更多的pythonic方法是使用生成器。 问题答案: 实际上这里有一些问题。 首先,正如NPE的回答很好地说明的那样,Python不会消除尾部调
JVM选项: 正如预期的那样,JVM将为JVM堆分配将近20MB的内存。 但请参阅以下 GC 详细信息: PSYoungGen总计9216K,已用4612k[0x 00000000 ff 6000000,0x 0000000010000000100000000]< br > Eden空间8192K,56%已用[0x 000000000 ff 600000,0x 0000000 FFA 812d 8
问题内容: 我决定尝试一些实验,以了解关于堆栈帧大小以及当前执行的代码在堆栈中的距离的发现。我们可能在这里调查两个有趣的问题: 当前代码有多少层深入堆栈? 当前方法在达到a之前可以达到多少级别的递归? 当前执行代码的堆栈深度 这是我为此能想到的最好的方法: 这似乎有点骇人听闻。它生成并捕获异常,然后查看堆栈跟踪的长度。 不幸的是,它似乎也有一个致命的限制,那就是返回的堆栈跟踪的最大长度为1024。
本文向大家介绍jvm最大内存限制多少?相关面试题,主要包含被问及jvm最大内存限制多少?时的应答技巧和注意事项,需要的朋友参考一下 考察点:JVM (1)堆内存分配 JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小 于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到
问题内容: 我指的是这种讨论。我从未用C或C++编写任何代码。我没有任何CS背景。但是,我从事Java开发人员已有5年了,现在我决定学习更多有关CS的知识,并进行一些后续工作。 问题答案: 在执行给定的代码段时,无论何时调用标准函数,执行时间都比将其中包含的代码转储到该函数中略高。每当在函数中包含的整个代码都无法维护时,就进行转储,因为这显然会导致整个代码重复。 内联 通过让您将函数声明为 内联(
我使用的计算机规格如下:OS-Windows7 professional Installed Memory(RAM):8Gb系统类型:64位操作系统JVM:Java version 8 update 91(jre1.8.0_91)64位版本 Java版本"1.8.0_91"Java(TM)SE运行时环境(内部版本1.8.0_91-b15)JavaHotSpot(TM)64位服务器VM(内部版本25