当使用某些Javascript代码模式时,Microsoft的IE6和IE7浏览器会遭受内存泄漏。在IE6早期,我已经找到了很多关于泄漏模式的信息。但是,我知道很多(但不是全部)这些都是在IE7和IE6的服务包中修复的。我找不到关于IE6和IE7修补版本中仍然存在哪些泄漏的可靠信息来源。
有几种工具可以检测泄漏模式。但我似乎无法以我想要的方式使用它们!
微软的(V2)内存泄漏检测器在我的代码中发现根本没有泄漏,即使我使用应该泄漏的模式。这可能是因为我正在运行IE8 - 是否有任何非头痛的方式让它假装是IE6或IE7?
Drip和sIEve似乎发现了“孤儿”品种的大量泄漏。当然这些必须是误报 - 实际上我添加到文档然后再删除的每个元素都列出了,我不相信我会继续引用它们。如果它们是真实的,我怎样才能找到我的代码中泄漏的位置?这些工具具有“属性”功能,不显示任何内容,使其看起来很破碎。同样,我不知道这些泄漏是否与IE6或IE7相关,或者只是IE8,这是我安装的IE的版本。
所以我真的想知道哪些类型的内存泄漏仍然是修补版本的IE6和IE7的问题,以及如何使用工具帮助我在我的实时代码中有效地找到它们。
任何帮助?
答案 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中似乎仍然存在。