代码之家  ›  专栏  ›  技术社区  ›  Michael Dubakov

你知道什么会导致JavaScript内存泄漏吗?

  •  23
  • Michael Dubakov  · 技术社区  · 16 年前

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

    5 回复  |  直到 16 年前
        1
  •  33
  •   jk.    16 年前

    有一篇关于 JavaScript and memory leaks . 它并没有具体介绍浏览器,而是描述了内存泄漏和JavaScript的整个问题。

    我认为这是一个更好的方法,当为公众开发一个网站时,尽可能不具体地为一些浏览器安装优化。

        2
  •  22
  •   AnthonyWJones    16 年前

    这里有一个典型的内存泄漏,即:

    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->函数作用域->elem->someElement

    在IE中,DOM元素是基于COM的引用计数对象,JavaScriptGC无法清除这些对象。

    在上述代码中添加最后一行将清除它:

    var elem = null;
    
        3
  •  3
  •   Greg    16 年前

    一般来说,循环引用是导致许多问题的原因。 我记得IE6(不确定它是否适用于7)使用xmlhttp泄漏非常严重…完成修复后,将onReadyStateChange设置为空。

        4
  •  2
  •   Gene T    16 年前

    您处理的是两种对象(和两种垃圾收集器)、javascript和dom对象,它们可以相互引用(循环引用),然后,即使页面卸载,GC也无法处理所有对象。下面是一个很好的描述:

    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
  •  1
  •   Atanas Korchev    16 年前

    你可以检查 this 有关Internet Explorer内存泄漏模式的msdn文章。还有一些检测内存泄漏的工具: