什么是内存洩露?
内存洩露是指分配给应用的内存不能被重新分配即使在内存已经不被使用的时候正常情况下垃圾回收器在DOM 元素和event 处理器不被引用或访问的时候回收它们但是IE 的早些版本(IE和之前)中内存洩露是很容易出现的因为内存管理器不能正确理解Javascript 生命周期而且在周期被打破(可以通过赋值为null 实现)前不会回收内存
Javascript 中出现内存洩露的主要原因是什么?
) DOM 插入顺序
当 个不同范围的DOM 对象附加到一起的时候一个临时的对象会被创建这个DOM 对象改变范围到document 时那个临时对象就没用了也就是说DOM对象应该按照从当前页面存在的最上面的DOM 元素开始往下直到剩下的DOM 元素的顺序添加这样它们就总是有同样的范围不会产生临时对象
) Javascript 闭包
因为Javascript 范围的限制许多实现依赖Javascript 闭包如果你想了解更多闭包方面的问题请查看我的前面的文章JavaScript Scope and Closure 闭包可以导致内存洩露是因为内部方法保持一个对外部方法变量的引用所以尽管方法返回了内部方法还可以继续访问在外部方法中定义的私有变量对Javascript 程序员来说最好的做法是在页面重载前断开所有的事件处理器
) 循环引用
一个很简单的例子一个DOM 对象被一个Javascript 对象引用与此同时又引用同一个或其它的Javascript 对象这个DOM 对象可能会引发内存洩露这个DOM 对象的引用将不会在脚本停止的时候被垃圾回收器回收要想破坏循环引用引用DOM 元素的对象或DOM 对象的引用需要被赋值为null
如何检测?
内存洩露对开发者来说一般很难检测因为它们是由大量代码中的一些意外的错误引起的但它在系统内存不足前并不影响程序的功能这就是为什么会有人在很长时间的测试期中收集应用程序性能指标来测试性能
最简单的检测内存洩露的方式是用任务管理器检查内存使用情况在Chrome 浏览器的新选项卡中打开应用并查看内存使用量是不是越来越多还有其他的调试工具提供内存监视器比如Chrome 开发者工具这是谷歌开者这网站中的堆分析的特性的教程