使用IE Javascript泄漏检测工具遇到困难

7

微软的IE6和IE7浏览器存在内存泄漏问题,当使用某些JavaScript代码模式时可能会出现此问题。早期IE6版本中有关于泄漏模式的大量信息。然而,据我了解,其中很多问题已经在IE7以及IE6的服务包中得到修复。目前我找不到一个可靠的信息来源来了解这些已经修复的版本中仍残留哪些泄漏问题。

有一些工具可以检测泄漏模式。但我似乎无法按照自己的意愿使用它们!

  • 微软的(V2)内存泄漏检测器在我的代码中找不到任何泄漏,即使我使用应该会出现泄漏的模式。这可能是因为我正在运行IE8 - 有没有什么简便方法可以让它模拟IE6或IE7?

  • Drip和sIEve似乎发现了大量"孤立"(orphan)类型的泄漏。这些肯定是假阳性 - 我添加到文档中又删除的几乎每个元素都被列出,而且我不认为我会保留对它们的引用。如果这些是真实的泄漏,则如何找到它们在我的代码中泄漏的位置?这些工具有一个"属性"功能,但它们没有展示任何信息,看起来似乎是有问题的。再次强调,我不知道这些泄漏是否与IE6或IE7相关,还是只针对我已安装的IE8版本。

因此,我真的想知道在修复版本的IE6和IE7中仍存在哪些类型的内存泄漏问题,并如何使用工具在我的实际代码中有效地找到它们。

可以提供帮助吗?


谢谢您的回答,galambalazs!但我很失望250点赏金并没有让我得到更多的回复... - thomasrutter
1个回答

2
我认为目前没有有效的工具来检测内存泄漏。不过,有一款软件可以在你的电脑上模拟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中仍然存在。

当您调用.remove()时,jQuery是否可以直接执行此操作? - Emil Ivanov
1
好问题。我已经测试过了,对于通过jQuery添加的事件来说是没问题的,但是通过其他方式添加的事件似乎会泄漏(使用jQuery remove)。 - gblazex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接