我一直在阅读以尝试理解浏览器中的内存泄漏,尤其是IE浏览器。我知道泄漏是由Javascript引擎和DOM对象树之间的垃圾收集算法不匹配引起的,并且会持续存在。我不明白的是为什么(根据我正在阅读的文章中的一些陈述)在浏览器卸载页面后没有回收内存。导航离开网页应该将所有DOM和javascript对象放在范围之外,不应该吗?
答案 0 :(得分:8)
这是问题所在。 IE为DOM和javascript提供了一个单独的垃圾收集器。他们无法检测两者之间的循环引用。
我们过去常常在页面卸载时从所有节点清除所有事件处理程序。但是,这可以在卸载时停止浏览器。这仅解决了循环引用是由事件处理程序引起的情况。它也可能是由于从DOM节点向js对象添加直接引用引起的,这些对象引用了DOM节点本身。
要记住的另一件好事是,如果要删除节点,最好先自己删除处理程序。 Ext-js有一个Ext.destroy方法就是这样做的(如果你使用ext设置处理程序)。
实施例
// Leaky code to wrap HTML elements that allows you to find the custom js object by adding
//a reference as an "expando" property
function El(node) {
this.dom = node;
node.el = this;
}
然后微软攻击IE,因此它在内部卸载时删除了所有事件处理程序和expando属性,因此它比使用js快得多。这个修复似乎解决了我们的记忆问题,但不是所有的问题,因为有人仍然有问题。
MS's description of the problem
MS releases patch that "fixes" memory leaks:
在我们公司,我们使用ext-js。通过始终使用具有内部清理例程的ext-js设置事件处理程序,我们没有遇到内存泄漏。实际上,对于具有4Gb RAM的机器,内存使用量会增加,但会停止在250Mb左右。我们认为这不太糟糕,因为我们加载了大约2Mb(未压缩)的js文件,并且页面上的所有元素都是动态的。
关于这一点有很多要说的,我们在工作的地方进行了广泛的研究。随意提出更具体的问题。我或许可以帮到你。
答案 1 :(得分:3)
关于Javascript memory leaks我读过的最好的事情是由Doulgas Crockford写的。
要回答您的问题,是的,浏览器绝对应该在适当的时间卸载所有对象(最重要的是,事件处理程序)。如果确实如此,它就不会泄漏:)
答案 2 :(得分:0)
你没有必要理解它们 - 它们是浏览器中的错误,并且从版本到版本都是固定的。