WebKit中的最大调用堆栈大小是否是V8的三倍?为什么?

时间:2019-03-20 20:49:51

标签: memory stack webkit v8

我从this博客中看到以下函数来计算最大调用堆栈大小:

function computeMaxCallStackSize() {
    try {
        return 1 + computeMaxCallStackSize();
    } catch (e) {
        // Call stack overflow
        return 1;
    }
}

如果从Chrome的控制台运行,则12530是结果(对于V8)

假设相同的函数为WebKit计算出相同的结果,为什么为Safari运行36243时得到的结果是什么?这是大小的三倍吗?我唯一遇到此错误的时间是在创建良好的ole无限循环时。这是一个任意决定吗?较大的堆栈尺寸会带来更大的好处吗?

1 个答案:

答案 0 :(得分:1)

(递归与否无关紧要)调用的最大数目由(1)可用堆栈空间的大小除以(2)活动函数的每个堆栈帧的大小确定。

(1)具有操作系统规定的上限;在我知道的系统上,它通常在1MB到8MB之间。低于该限制,JavaScript引擎可以设置自己的限制。 V8在所有平台上都设置了一个小于一兆字节的限制,以使不同的平台表现得尽可能相似。我不知道Safari / JavaScriptCore会做什么。

(2)取决于JavaScript引擎的实现细节(具体来说,它在每个堆栈帧中用于内部数据的插槽数),以及所涉及的每个函数中的局部变量数。

如您所见,通常只有在意外无限递归的情况下才进入堆栈限制。因此,对于大多数实际应用而言,限制的具体值并不重要,并且较大的堆栈也无济于事。

请注意,堆栈空间与最大内存消耗(即堆空间)无关。您可以拥有1 GB的堆,而只有1 MB的堆栈。