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

Memory WebKit中的最大调用堆栈大小是否是V8的三倍?为什么?,memory,stack,webkit,v8,Memory,Stack,Webkit,V8,我在博客文章中看到了以下计算最大调用堆栈大小的函数: function computeMaxCallStackSize() { try { return 1 + computeMaxCallStackSize(); } catch (e) { // Call stack overflow return 1; } } 如果从Chrome的控制台运行,12530是结果(对于V8) 假设相同的函数为WebKit计算相同的结果,为

我在博客文章中看到了以下计算最大调用堆栈大小的函数:

function computeMaxCallStackSize() {
    try {
        return 1 + computeMaxCallStackSize();
    } catch (e) {
        // Call stack overflow
        return 1;
    }
}
如果从Chrome的控制台运行,
12530
是结果(对于V8)

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

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

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

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

正如您所观察到的,在偶然的无限递归的情况下,通常只会遇到堆栈限制。因此,对于大多数实际应用程序,限制的具体值并不重要,而且更大的堆栈也不会带来任何好处

请注意,堆栈空间与最大内存消耗(也称为堆空间)无关。您可以拥有千兆字节的堆,而只有一兆字节的堆栈