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

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

  • Microsoft的(V2)内存泄漏检测器在我的代码中根本没有发现泄漏,即使我使用了应该泄漏的模式也是如此。这可能是因为我运行的是IE8-是否有任何让其假装为IE6或IE7的方法?
  • Drip和sIEve似乎发现了“孤儿”变种的大量泄漏。当然,这些肯定是误报-实际上,列出了我添加到文档中然后又删除的每个元素,而且我不相信自己会引用它们。如果它们是真实的,我如何才能找到它们在代码中泄漏的位置?这些工具具有“属性”功能,该功能什么也不显示,使其看起来很破损。同样,我不知道这些泄漏是与IE6还是IE7相关,还是仅与IE8相关,IE8是我已安装的IE版本。

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

    有什么帮助吗?

    最佳答案

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

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



    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中似乎仍然存在此问题。

    09-16 07:30