【发布时间】:2012-04-20 23:16:36
【问题描述】:
我已经阅读了很多关于 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。
想法?
谢谢!
【问题讨论】:
-
请记住:Java != Javascript。与 Java 不同,每个浏览器可能有完全不同的垃圾收集实现。例如:javascript.crockford.com/memory/leak.html
-
re: java vs. javascript:: 当然 - 这不是我第一次参加牛仔竞技表演,但感谢您的提醒 ;) 不幸的是,我现在时间紧迫,没有时间阅读整本书只是为了找到解决这个问题的方法:(
-
您在系统任务管理器中看到的 Chrome 内存使用情况是应用程序正在使用的总内存。其中一些内存实际上可能会保留以供将来在应用程序中使用。所以,仅仅因为你的内存上升一次并且没有下降并不意味着你有泄漏。可能是 Chrome 从系统分配的供将来使用的内存池更大。只要不重复使用,就不是泄漏。
-
@jfriend00 令人着迷——我想我希望它更像一个调试器/分析器来告诉你当前的内存分配。不幸的是,对我来说,它确实呈上升趋势(尽管呈锯齿形)。
标签: javascript performance memory-leaks