【问题标题】:Javascript: memory leak with loop?Javascript:循环内存泄漏?
【发布时间】:2011-11-14 18:56:48
【问题描述】:

我有一个简单的循环来创建和销毁(希望是)空对象: http://jsfiddle.net/TgWze/

function Test()
{
}

function generate()
{
    for(var i = 0; 1000 > i; ++i)
    {
        var view = new Test();

        delete view;
    }
}

如果我继续单击链接,Chrome/Safari 中的内存配置文件会显示类似内存泄漏的行为: http://cl.ly/BnCV

我错过了什么吗?

【问题讨论】:

  • 除了可能的内存泄漏之外,“删除”是多余的,因为无论如何在一个循环之后引用将超出范围。
  • 你实际上不能像那样使用delete;它仅用于删除对象中的属性。
  • @Dykam:错了。 Javascript 没有块作用域。
  • 我已经更正了(最近 perl 太多了),我的意思是说旧的视图变量将在下一个循环中通过重新定义超出范围。
  • 谁会一直让那些坚持手动内存管理思维的开发人员使用 GC 语言进行编程?

标签: javascript memory loops memory-leaks


【解决方案1】:

这看起来像正常的 GC 行为。一旦对象过多,GC 就会清理它们。

如果每个峰值后的波谷(就在 GC 运行之后)逐渐变高,这只是内存泄漏,表明 GC 没有捕获所有内容。

【讨论】:

    【解决方案2】:

    这是托管内存。所以它会在垃圾收集器运行时收集已删除的对象。您删除对象实际上并没有做任何事情。但是,由于视图永远不是参考,因此应该很容易收集。

    【讨论】:

    • 所以,这里的重点是,下次运行垃圾收集器时,该对象将被删除。这在概念上与 C++ new/delete 不同,这就是我在分析器中看到内存增加的原因,b/c 链接被点击太频繁,然后内存下降,这是由于垃圾收集器运行。谢谢。
    • 没错,虽然new 确实分配了一些内存;删除不会释放它
    【解决方案3】:

    该代码不会泄漏。

    为了说服自己,您可以拍摄内存快照并比较前后。请查看我编写的本指南,了解更多详细信息:http://www.vladalexandruionescu.com/2012/08/javascript-memory-leaks.html

    【讨论】:

      猜你喜欢
      • 2017-06-06
      • 2011-01-01
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-03
      • 2016-01-13
      • 2018-05-13
      相关资源
      最近更新 更多