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

标签 javascript google-chrome memory heap-memory

如果我故意在 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);
    }
}

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

但是,如果我使用类型化数组(例如 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);
    }
}

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

仅仅是因为 TypedArrays 绕过了 JS 堆限制吗?为什么?对于 TypedArrays,还有什么我应该关心的吗?

最佳答案

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

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

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

关于javascript - 在 Chrome 中,为什么 TypedArrays 不在 JS 堆上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35587561/

相关文章:

javascript - 尝试在选择输入时隐藏某些内容

javascript - 使用或不使用 jQuery 获取屏幕上的 float div 位置

javascript - 根据日期和时间显示打开或关闭

javascript - 如何识别由于 Chrome 扩展而导致的 DOM html 代码更改

javascript - getElementById 和 jquery 之间的区别 $('#smth' )

html - Chrome 在 div 内部和我的 CSS 显示之间添加奇怪的填充 : table

javascript - "' x'的含义不是函数或其返回值不可迭代”错误

memory - 是伟大的内存是伟大的编程的要求

java - 提高性能一致性的方法

c - 分配数组元素值未按预期工作