7

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

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

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

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

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

有什么帮助吗?

4

1 回答 1

2

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

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

当 DOM 对象包含对 JavaScript 对象的引用(例如事件处理函数),并且当该 JavaScript 对象包含对该 DOM 对象的引用时,就会形成循环结构。 - http://javascript.crockford.com/memory/leak.html

这种循环结构是 IE 难以处理的问题。您应该了解循环引用是如何形成的(通过闭包)。第一步是在删除 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 事件处理程序,或者通过闭包在其他任何地方)。您应该检查删除元素的位置,并找出引用它们的函数。

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

于 2010-11-17T09:10:40.683 回答