Javascript 在Chrome中,为什么TypeDarray不在JS堆上?
如果我在Chrome(v48)中故意使用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++)
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不匹配。