我阅读了大量有关 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 内存,所以它不像垃圾收集从来没有发生过……似乎“params”的一个实例总是被保留着。我尝试过设置子闭包和其他东西......没有骰子。
然而,最令人不安的是内存使用量呈上升趋势。目前它可能“只是”75MB,但让它运行足够长的时间(过夜),它就会达到 500MB。
想法?
谢谢!
最佳答案
分配 25mb 会导致发生 GC。此 GC 会清理最后一个实例,但当然不会清理当前实例。所以你身边总是有一个实例。
当程序空闲时,GC不会发生。它不会在您的计时器调用之间发生,因此内存会保留下来。
关于javascript - 尝试理解 Javascript 闭包 + 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10254725/