Javascript 在Chrome中,为什么TypeDarray不在JS堆上?

Javascript 在Chrome中,为什么TypeDarray不在JS堆上?,javascript,google-chrome,memory,heap,Javascript,Google Chrome,Memory,Heap,如果我在Chrome(v48)中故意使用JS数组浪费内存,请重复调用: var rootReference; function wasteBunchOfMemoryWithJsArrays() { rootReference = rootReference || []; for (var i = 0; i < 1000; i++) { var blah = []; for (var j = 0; j < 10000; j++)

如果我在Chrome(v48)中故意使用JS数组浪费内存,请重复调用:

var rootReference;
function wasteBunchOfMemoryWithJsArrays()
{
    rootReference = rootReference || [];
    for (var i = 0; i < 1000; i++)
    {
        var blah = [];
        for (var j = 0; j < 10000; j++)
        {
            blah.push(j);
        }

        rootReference.push(blah);
    }
}
var typedRootReference;
function wasteBunchOfMemoryWithInt32Arrays() 
{
    typedRootReference = typedRootReference || [];
    for (var i = 0; i < 100; i++) {
        var blah = new Int32Array(100000);

        for (var j = 0; j < 100000; j++) {
            blah[j] = j;
        }

        typedRootReference.push(blah);
    }
}
然后我可以不断地提高,直到我达到我认为的Windows 32位进程内存限制2.9GB左右


TypeDarray绕过JS堆限制的情况是否简单?为什么?关于TypedArrays还有什么我应该关心的吗?

存储在类型化数组中的数据,因为它都是数字,保证不包含对其他对象的任何引用,因此它对任何其他对象是否是垃圾没有影响。因此,垃圾收集器不需要扫描、复制或以其他方式操作数据

有鉴于此,将此类“纯”“批量”数据放在垃圾收集器堆之外是一种非常常见的实现策略,以减少垃圾收集器必须管理的数据量


正如您所观察到的,这并不意味着应该有两个单独的内存限制(或没有限制),但如果不努力施加一个组合内存限制,就会发生这种情况。

顺便说一句,我在Firefox中没有发现相同的行为。我想,正如你所建议的,这只是谷歌为Chrome提供的一个实现。我一直在读“ChromeV8中每个标签的1GB限制”,但我无法复制它,而且它似乎与performance.memory.jsHeapSizeLimit不匹配。