我一直在阅读,试图弄清楚浏览器中的内存泄漏,尤其是. IE浏览器.我知道泄漏是由
Javascript引擎和DOM对象树之间的垃圾收集算法不匹配引起的,并且会持续存在.我不明白的是为什么(根据我正在阅读的文章中的一些陈述)在浏览器卸载页面后不回收内存.导航离开网页应该将所有DOM和javascript对象放在范围之外,不应该吗?
解决方法
这是问题所在. 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文件,并且页面上的所有元素都是动态的.
关于这一点有很多要说的,我们在工作的地方进行了广泛的研究.随意提出更具体的问题.我或许可以帮到你.