【问题标题】:Do you know what may cause memory leaks in JavaScript?你知道什么可能导致 JavaScript 中的内存泄漏吗?
【发布时间】:2010-09-15 06:52:04
【问题描述】:

你知道什么可能导致 JavaScript 中的内存泄漏吗? 我对浏览器感兴趣:IE 7、FireFox 3、Safari 3

【问题讨论】:

    标签: javascript memory-leaks


    【解决方案1】:

    有一篇关于JavaScript and memory leaks 的好文章。它没有具体针对浏览器,而是描述了内存泄漏和 JavaScript 的整个问题。

    我认为,在为公众开发网站时,尽可能不针对浏览器进行优化是一种更好的方法。

    【讨论】:

    • 关于这个主题的优秀文章。 +1
    • 对于那些可能对 IE8 感兴趣的人来说,可能值得知道的是,本文中解释的大多数示例都不再在 IE8 中泄漏内存。应该读这个:stackoverflow.com/questions/1999840/…
    【解决方案2】:

    这是一个经典的 IE 内存泄漏:-

    function body_onload()
    {
        var elem = document.getElementById('someElementId');
        // do stuff with elem
        elem.onclick = function() {
            //Some code that doesn't need the elem variable
        }
     }
    

    在这段代码运行之后,会出现循环引用,因为元素有一个分配了其 onclick 事件的函数,该函数引用了一个作用域对象,而作用域对象又持有对元素的引用。

    someElement->onclick->function-scope->elem->someElement

    在 IE DOM 元素中是基于 COM 的引用计数对象,Javascript GC 无法清理。

    在上面的代码中添加最后一行会清理它:-

    var elem = null;
    

    【讨论】:

      【解决方案3】:

      一般;循环引用是许多问题的原因。 我记得 IE 6(不确定它是否适用于 7)在使用 XMLHTTP 时泄漏非常严重...一旦完成修复,就设置 onreadystatechange = null。

      【讨论】:

      • 是的,问题适用于 7。而且您不能分配 null,因为它不是一个函数,您需要在全局范围内创建的 void function function() {} 和/或分配 null到持有对 xmlhttp 对象的引用的变量。
      【解决方案4】:

      您正在处理 2 种对象(和 2 个垃圾收集器),javascript 和 DOM 对象,它们可以相互引用(循环引用),然后即使页面卸载。这是一个很好的描述:

      http://getben.com/archive/2006/05/30/Resolving-JavaScript-Memory-Leaks.aspx

      http://www.josh-davis.org/2007/04/11/javascript-built-in-listeners-and-memory-leaks/

      【讨论】:

        【解决方案5】:

        您可以查看this MSDN 文章以了解 Internet Explorer 内存泄漏模式。还有一些检测内存泄漏的工具:

        【讨论】:

          猜你喜欢
          • 2013-10-16
          • 1970-01-01
          • 1970-01-01
          • 2020-04-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多