难以使用IE Javascript泄漏检测器

时间:2010-11-17 03:38:23

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

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

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

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

  • Drip和sIEve似乎发现了“孤儿”品种的大量泄漏。当然这些必须是误报 - 实际上我添加到文档然后再删除的每个元素都列出了,我不相信我会继续引用它们。如果它们是真实的,我怎样才能找到我的代码中泄漏的位置?这些工具具有“属性”功能,不显示任何内容,使其看起来很破碎。同样,我不知道这些泄漏是否与IE6或IE7相关,或者只是IE8,这是我安装的IE的版本。

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

任何帮助?

1 个答案:

答案 0 :(得分: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事件处理程序,或者其他任何地方,但 closure )。您应该检查删除元素的位置,并找出哪些函数引用它们。

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