2

我一直在阅读很多关于 Javascript 中的闭包的内容。我来自更传统的(C、C++ 等)背景并了解调用堆栈等,但我在 Javascript 中的内存使用方面遇到了麻烦。这是我设置的(简化的)测试用例:

function updateLater(){
    console.log('timer update');

    var params = new Object();
    for(var y=0; y<1000000; y++){
        params[y] = {'test':y};
    }
}

或者,我也尝试过使用闭包:

function updateLaterClosure(){

return (function(){

    console.log('timer update');
    var params = new Object()
    for(var y=0; y<1000000; y++)
    {
        params[y] = {'test':y};
    }
});
}

然后,我设置了一个间隔来运行该功能......

setInterval(updateLater, 5000); // or var c = updateLaterClosure(); setInterval(c,5000);

计时器第一次运行时,内存使用量从 50MB 跳到 75MB(根据 Chrome 的任务管理器)。第二次超过 100MB。偶尔它会回落一点,但绝不会低于 75MB。

自己检查一下:https ://local.phazm.com:4435/Streamified/extension/branches/lib/test.html

显然,params 没有被完全垃圾收集,因为第一次计时器调用的内存没有被释放......但是,它也没有在每次调用时增加 25MB 的内存,所以好像垃圾收集永远不会发生...似乎总是保留一个“参数”实例。我试过设置一个子关闭和其他东西......没有骰子。

然而,最令人不安的是内存使用量呈上升趋势。现在它可能“只是”75MB,但让它运行足够长的时间(一夜之间),它会达到500MB。

想法?

谢谢!

4

2 回答 2

1

分配 25mb 会导致 GC 发生。此 GC 清理最后一个实例,但当然不是当前实例。所以你总是有一个实例。

程序空闲时不会发生 GC。它不会在您的计时器调用之间发生,因此内存会保留。

于 2012-04-20T23:21:12.570 回答
1

这甚至不是一个关闭。闭包是当您从函数返回某些东西时,例如数组、函数、对象或任何可以包含引用的东西,并且它带有该函数的所有本地成员。

你所拥有的只是一个非常长的循环正在构建一个非常大的对象的情况。也许你的记忆没有像你建造巨大的物体那样快地被回收。

于 2012-04-20T23:27:06.233 回答