javascript - 尝试理解 Javascript 闭包 + 内存泄漏

标签 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 没有被完全垃圾收集,因为第一次计时器调用的内存没有被释放......但是,它也没有在每次调用时添加 25MB 内存,所以它不像垃圾收集从来没有发生过……似乎“params”的一个实例总是被保留着。我尝试过设置子闭包和其他东西......没有骰子。

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

想法?

谢谢!

最佳答案

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

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

关于javascript - 尝试理解 Javascript 闭包 + 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10254725/

相关文章:

Javascript:图像对象的 onerror 事件有哪些参数?如何获取与图像相关的错误的更多详细信息?

javascript - parsley.js - 禁用最大长度验证

mysql - 很多小的 mysql 表或一张大表

c - 分配还是不分配。大小 1 错误的读取无效。 【凝视2小时】

c++ - Qt5 中的内存泄漏?如何删除 QMimeData?

ios - 简单的 UITableView 内存泄漏

javascript - 将 async/await 与 forEach 循环结合使用

javascript - 在javascript中迭代json数组

mysql - 远程mysql服务器速度

performance - 减少 Haskell 程序中的垃圾收集暂停时间