2

为什么这会给我致命错误:JS 分配失败 - 进程内存不足

arr = []

for (var x=0;x<6000;x++){
    var ys=[];
    arr.push(ys);
    for (var y=0;y<6000;y++){
        var tile = [0,1,2];
        ys.push(tile);
    }
}

在我看来,它只有 108000000 个整数,即 432mb,与 1.4gb 的限制相差甚远

4

1 回答 1

5

你不计算的东西:

  • 数组对象的开销
  • 对象引用的大小
  • 程序正在做的任何其他事情
  • Node.js 内存本身

如果我们假设对象引用是 64 位的(不确定大小......),那么您有 3600 万个引用 * 4 字节 = 144 兆字节。

在我们计算阵列开销之前,您最多有 576 MB。

此外,由于数组是可调整大小的,我不确定分配的长度是否完全基于大小,或者运行时是否会分配额外的内存以防万一。

如果我记得,当扩展 Java 中的 ArrayList 时,它实际上会翻倍。

我不确切知道数组是如何在 JavaScript 中实现的,但鉴于读取 array.length 是恒定时间,每个数组可能都有一个预先计算的长度属性。

由于您有 3600 万个数组,因此您还有 144 兆字节。

到目前为止 720 MB 并且还在增加。

我希望这些数组不会像 ArrayList 那样被双重分配。

于 2013-04-28T21:08:33.360 回答