试图理解Javascript闭包+内存泄漏

时间:2012-04-20 23:16:36

标签: javascript performance memory-leaks

我一直在阅读关于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没有被完全垃圾收集,因为来自第一个定时器调用的内存没有被释放......但是,它也没有在EACH调用中添加25MB的内存,所以它不像垃圾收集永远不会发生......似乎似乎总是有一个“参数”的例子。我已经尝试过设置子关闭和其他东西......没有骰子。

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

想法?

谢谢!

2 个答案:

答案 0 :(得分:1)

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

程序空闲时不会发生GC。在您的定时器调用之间不会发生这种情况,因此内存会保持不变。

答案 1 :(得分:1)

这甚至都不是封闭。 A closure is when you return来自函数的东西,比如数组,函数,对象或任何可以包含引用的东西,它带有该函数的所有本地成员。

你所拥有的只是一个非常长的循环,它构建了一个非常大的对象。也许你的记忆不像你正在建造巨大的物体那样快速回收。