【发布时间】:2010-09-15 06:52:04
【问题描述】:
你知道什么可能导致 JavaScript 中的内存泄漏吗? 我对浏览器感兴趣:IE 7、FireFox 3、Safari 3
【问题讨论】:
你知道什么可能导致 JavaScript 中的内存泄漏吗? 我对浏览器感兴趣:IE 7、FireFox 3、Safari 3
【问题讨论】:
有一篇关于JavaScript and memory leaks 的好文章。它没有具体针对浏览器,而是描述了内存泄漏和 JavaScript 的整个问题。
我认为,在为公众开发网站时,尽可能不针对浏览器进行优化是一种更好的方法。
【讨论】:
这是一个经典的 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;
【讨论】:
一般;循环引用是许多问题的原因。 我记得 IE 6(不确定它是否适用于 7)在使用 XMLHTTP 时泄漏非常严重...一旦完成修复,就设置 onreadystatechange = null。
【讨论】:
您正在处理 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/
【讨论】:
您可以查看this MSDN 文章以了解 Internet Explorer 内存泄漏模式。还有一些检测内存泄漏的工具:
【讨论】: