【问题标题】:Can this code produce memory leak?这段代码会产生内存泄漏吗?
【发布时间】:2015-09-24 11:42:42
【问题描述】:

看起来我在我的代码中发现了内存泄漏,但我不确定,而且我对 nodejs 内存泄漏没有太多经验。

谁能解释一下,这段代码会产生内存泄漏吗?

    var tasks = [];

    // each 10 seconds
    tasks.push(function () { 
            console.log('hello, world!'); 
    });

    // each minute
    while (tasks.length) {
            var task = tasks.shift();
            task();
    }

UPD:在我的代码中错过了 while 循环,现在更新。

我的问题是,我的数组中的匿名函数的范围会从内存中清除吗?

【问题讨论】:

  • 我们需要看更多的周边代码。理想情况下,MCVE。这很重要,因为重要的是创建、删除这些的上下文是什么等。但是做一些合理的假设,那里没有 leak 本身,只是你在添加函数 比您删除它们快很多,因此内存使用量会随着时间的推移而增加。不是泄漏,因为您有意保留对这些函数的引用,但绝对值得一看。

标签: javascript node.js memory-leaks


【解决方案1】:

好吧,这不是内存泄漏,而是您将新元素放入数组中的速度比检索它们的速度快 6 倍。 结果,您实际上将只使用 5 个推送函数中的一个,并且您的数组将继续增长。 如果你让它运行足够长的时间,你最终会得到一个永远无法清空的庞大数组。

编辑:在您添加while 循环后,数组不再增长,并且您的这部分代码不应该有任何内存泄漏。这并不意味着您的项目中没有。确保您推送的函数中创建的任何值都可以正确地被垃圾收集(即您没有在某处保留对它的引用)。

【讨论】:

  • 我现在更新了我的示例,之前错过了 while 循环。是的,数组会增加,但是数组中的匿名函数的范围会从内存中清除吗?这是我想知道的。
  • @user4176305 是的。如果你不保留任何引用,匿名函数及其作用域将被垃圾收集。这里没有内存泄漏。
猜你喜欢
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
相关资源
最近更新 更多