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

Bre*_*ill 5 javascript memory heap google-chrome

如果我故意在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后浏览器选项卡崩溃大约700MB使用率(根据任务管理器),大致匹配中指定的限制performance.memory.jsHeapSizeLimit.

但是,如果我使用TypedArray(如Int32Array)浪费内存,请重复调用:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我可以继续上升,直到达到我认为的Windows 32位进程内存限制大约2.9GB!

是否只是TypedArrays绕过JS堆限制的情况?为什么?我还应该关注TypedArrays吗?

Kev*_*eid 4

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

\n\n

鉴于此,将此类 \xe2\x80\x9cpure\xe2\x80\x9d \xe2\x80\x9cbulk\xe2\x80\x9d 数据放置在垃圾收集器堆之外,以减少垃圾收集器的数量是一种非常常见的实现策略。垃圾收集器必须管理的数据。

\n\n

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

\n