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

IT技术 javascript memory-leaks
2021-03-22 15:04:20

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

5个回答

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

我认为在为公众开发网站时,最好的方法是尽可能不特定于浏览器,而不是针对少数浏览器进行优化。

关于这个主题的优秀文章。+1
2021-05-02 15:04:20
对于可能对 IE8 感兴趣的任何人,可能值得知道的是,本文中解释的大多数示例不再是 IE8 中的内存泄漏。应该阅读:stackoverflow.com/questions/1999840/...
2021-05-20 15:04:20

这是 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 。

是的,问题适用于 7。并且您不能分配 null,因为它不是一个函数,您需要在全局范围内创建的 void function function() {} 和/或将 null 分配给持有对 xmlhttp 的引用的变量目的。
2021-04-23 15:04:20

您正在处理 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/

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