如果我故意在 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/