【问题标题】:Having difficulty using IE Javascript leak detectors难以使用 IE Javascript 泄漏检测器
【发布时间】:2011-05-11 05:13:49
【问题描述】:

Microsoft 的 IE6 和 IE7 浏览器在使用某些 Javascript 代码模式时会出现内存泄漏。在 IE6 早期,我发现了很多关于泄漏模式的信息。但是,我知道其中许多(但不是全部)已在 IE7 和 IE6 的服务包中修复。我找不到可靠的信息来源来说明那些修补过的 IE6 和 IE7 版本中仍然存在哪些漏洞。

有几种工具可以检测泄漏模式。但我似乎无法以我想要的方式使用它们!

  • Microsoft 的 (V2) 内存泄漏检测器在我的代码中根本没有发现任何泄漏,即使我使用了应该泄漏的模式。这可能是因为我正在运行 IE8 - 有什么不让人头疼的方法让它伪装成 IE6 或 IE7?

  • Drip 和 sIEve 似乎发现了大量的“孤立”漏洞。当然,这些肯定是误报——几乎我添加到文档中然后再次删除的每个元素都会被列出,而且我不相信我会保留对它们的引用。如果它们是真实的,我如何才能找到它们在我的代码中泄漏的位置?这些工具有一个“属性”功能,它什么也没有显示,看起来像是坏了。同样,我不知道这些泄漏是否与 IE6 或 IE7 相关,或者仅与 IE8(我安装的 IE 版本)相关。

所以我真的很想知道 IE6 和 IE7 的修补版本仍然存在哪些类型的内存泄漏问题,以及如何使用帮助我的工具在我的实时代码中有效地找到它们。

有什么帮助吗?

【问题讨论】:

  • 感谢您的回答 galambalazs!我很失望 250 点的赏金没有让我得到更多的回复......

标签: javascript memory-leaks internet-explorer-7 internet-explorer-6 memory-leak-detector


【解决方案1】:

我认为没有检测内存泄漏的有效工具。但是,有一个软件可以用来在 PC 上模拟 IE 6-7-8,它叫做 IE Tester

Internet Explorer 最常见的泄漏是与 JScript 的交互。

当一个 DOM 对象包含一个引用时 到一个 JavaScript 对象(这样一个事件 处理函数),以及何时 JavaScript 对象包含一个引用 到那个 DOM 对象,然后是一个循环 结构形成。 - http://javascript.crockford.com/memory/leak.html

这种循环结构是 IE 难以处理的问题。您应该了解循环引用是如何形成的(通过 closure)。第一步是在删除 DOM 元素之前清理它们。

这可以通过这样的通用函数来完成:

function purge(d) {
    var a = d.attributes, i, l, n;
    if (a) {
        l = a.length;
        for (i = 0; i < l; i += 1) {
            n = a[i].name;
            if (typeof d[n] === 'function') {
                d[n] = null;
            }
        }
    }
    a = d.childNodes;
    if (a) {
        l = a.length;
        for (i = 0; i < l; i += 1) {
            purge(d.childNodes[i]);
        }
    }
}

每次从 DOM 中删除元素时,都需要先在其上使用 purge。你甚至可以为此编写一个包装器

function safeRemove(el) {
  purge(el);
  el.parentNode.removeChild(el);
}

当然,这只是一个起点,因为它不会帮助您在其他地方进行引用(例如 DOM2 事件处理程序,或者通过 closure 的任何其他地方)。您应该检查删除元素的位置,并找出引用它们的函数。

这个问题在 IE 6-7-8 中似乎仍然存在。

【讨论】:

  • 当您调用 .remove() 时,jquery 是否开箱即用?
  • 好问题。我已经对其进行了测试,对于您通过 jQuery 添加的事件,它很好,但是以任何其他方式添加的事件似乎会泄漏(使用 jQuery remove)。
猜你喜欢
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
相关资源
最近更新 更多