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吗?
存储在类型化数组中的数据,因为都是数字,保证不包含任何对其他对象的引用,因此它对任何其他对象是否是垃圾没有影响。因此,数据不需要由垃圾收集器扫描、复制或以其他方式操作。
\n\n鉴于此,将此类 \xe2\x80\x9cpure\xe2\x80\x9d \xe2\x80\x9cbulk\xe2\x80\x9d 数据放置在垃圾收集器堆之外,以减少垃圾收集器的数量是一种非常常见的实现策略。垃圾收集器必须管理的数据。
\n\n正如您所观察到的,这没有根本原因意味着 \xc2\xa0 应该有两个单独的内存限制(或缺乏限制),但如果不努力施加组合内存限制,就会发生这种情况。
\n| 归档时间: |
|
| 查看次数: |
73 次 |
| 最近记录: |