你知道什么可能导致JavaScript中的内存泄漏吗?

时间:2008-10-04 14:23:38

标签: javascript memory-leaks

您知道JavaScript中可能导致内存泄漏的原因吗? 我对浏览器感兴趣:IE 7,FireFox 3,Safari 3

5 个答案:

答案 0 :(得分:33)

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

在为公众开发网站时,我认为这是一种更好的方法,可以像浏览器一样,针对少数浏览器进行优化。

答案 1 :(得分:22)

以下是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->功能scope-> elem-> someElement

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

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

var elem = null;

答案 2 :(得分:3)

总的来说;循环引用是许多问题的原因。 我记得IE 6(不确定它是否适用于7)使用XMLHTTP泄漏得非常糟糕...设置onreadystatechange = null一旦完成修复它。

答案 3 :(得分:2)

你正在处理2种对象(和2个垃圾收集器),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/

答案 4 :(得分:1)

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