【问题标题】:Memory leak in JavaScript (Chrome)JavaScript (Chrome) 中的内存泄漏
【发布时间】:2011-07-08 02:32:53
【问题描述】:

我每秒调用一个函数 50 次,这会做一些昂贵的事情,因为它在 <canvas> 元素上绘制了很多。

它工作得很好,没有问题,但我只是看了一下内存使用情况,它每秒钟占用了我 1MB 的 RAM。 Chrome 似乎会进行垃圾收集,因为它每分钟左右就会下降一次,但随后使用量又增加了。

我尝试将return 放在我的函数中的某些位置,以便确定我的函数的哪一部分确实导致了泄漏。我已经能够将它缩减为特定的代码行,之后邪恶的部分就来了,但我真的不知道如何解决它。

我的问题是:

  • 有什么工具可以有效测量 Chrome 中的 JavaScript 内存泄漏?
  • 变量在使用后设置为null / undefined 是否有效,比如丢弃它们?

如果源代码真的很有必要,我会毫不犹豫地在这里发布,但我必须承认它既长又可能对其他人来说有点难以理解。

【问题讨论】:

    标签: javascript google-chrome memory-leaks


    【解决方案1】:

    我只是直接引用这篇文章,链接自文章;

    说到内存泄漏,破坏循环引用(泄漏的原因)通常是通过简单的空分配来完成的。通常不需要使用删除。此外,null'ing 允许“取消引用”变量——这是 delete 通常无法做到的。

    var el = document.getElementById('foo');
    // circular reference is formed
    el.onclick = function() { /* ... */ };
    // circular reference is broken
    el = null;
    // can't `delete el` in this case, as `el` has DontDelete
    

    由于这些原因,在破坏循环引用时最好坚持使用 null。

    delete Explained

    【讨论】:

    • 其实我没有循环引用。这都是自定义的Vector 类,它们在我的渲染器函数中表示 3D 和 2D 中的点。如果我每秒调用该函数 50 次,我猜它们会在内存中累积。 null'ing 还会有帮助吗?目前我一直在尝试无济于事,都使用delete= null
    • @pimvdb 阅读这篇文章,它很长,但非常透彻地展示了删除的实际工作原理。我不能说这两种选择对你来说是否成功。 js 泄漏总是一个b**ch。
    【解决方案2】:

    查看 Chrome 开发者工具的 Profiles 选项卡下的堆配置文件,了解有关内存使用的信息。

    您可以执行以下操作来防止内存泄漏:

    • 使用JSLint 测试您的代码,看看是否能给您一些指导。
    • 使用var 关键字为您的变量指定函数范围,以便在超出范围时对它们进行垃圾回收。没有 var 关键字的变量具有全局范围。
    • 使用delete variable; 语句从内存中删除对象以及引用。将变量设置为 null 只会从内存中删除对象,而不是其引用。

    【讨论】:

    • 谢谢。您是否知道 for 循环变量(例如 i)是否会在 for 循环结束后自动释放?
    • @pimvdb:它不会,因为只有函数在 javascript 中定义范围。在此处阅读有关 javascript 范围的更多信息:adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting
    猜你喜欢
    • 1970-01-01
    • 2013-11-06
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 2021-04-10
    • 1970-01-01
    相关资源
    最近更新 更多