在JavaScript中,由于编码者忽略或者不注意某些细节,经常会造成内存泄露。
首先,什么是内存泄漏?这是个什么东西?
内存泄露是指分配给应用的内存不能被重新分配,即使在内存已经不被使用的时候。正常情况下,垃圾回收器在 DOM 元素和 event 处理器不被引用或访问的时候回收它们。但是,IE 的早些版本(IE7和之前)中内存泄露是很容易出现的,因为内存管理器不能正确理解 Javascript 生命周期而且在周期被打破(可以通过赋值为 null 实现)前不会回收内存。内存泄露会降低 Web 应用程序的性能,直到浪费的内存超过了系统所能分配的,应用程序将不能使用。
这个东西很可怕,怎样造成了这样子?
1) 循环引用
一个很简单的例子:一个 DOM 对象被一个 Javascript 对象引用,与此同时又引用同一个或其它的 Javascript 对象,这个 DOM 对象可能会引发内存泄露。这个 DOM 对象的引用将不会在脚本停止的时候被垃圾回收器回收。要想破坏循环引用,引用 DOM 元素的对象或 DOM 对象的引用需要被赋值为 null。
2) Javascript 闭包
闭包可以导致内存泄露是因为内部方法保持一个对外部方法变量的引用,所以尽管方法返回了,内部方法还可以继续访问在外部方法中定义的私有变量。对 Javascript 程序员来说最好的做法是在页面重载前断开所有的事件处理器。
3) DOM 插入顺序
当 2 个不同范围的 DOM 对象附加到一起的时候,一个临时的对象会被创建。这个 DOM 对象改变范围到 document 时,那个临时对象就没用了。也就是说, DOM 对象应该按照从当前页面存在的最上面的 DOM 元素开始往下直到剩下的 DOM 元素的顺序添加,这样它们就总是有同样的范围,不会产生临时对象。
垃圾回收
javascript是一门具有自动垃圾收集机制的编程语言,执行环境会负责管理代码执行过程中使用的内存,人为不用管。这种机制就是:找出那些补在继续使用的变量,然后释放其占用的内存。所以,垃圾收集器会按照固定的时间间隔,周期性地执行这一操作。
方法:标记清除,给当前不使用的值加上标记,然后将其回收。另一种就是“引用计数“,跟踪记录所有的值被引用的次数。