概述
垃圾收集器会定期(周期性)找出不在使用的变量,然后释放内存,这个过程不是实时性的,因为开销比较大,所以垃圾回收器会按照固定的时间间隔执行。
垃圾回收两种策略
- 标记清除
对于脱离作用域的变量进行回收,当进入作用域时,对变量进行标记,离开作用域时,标记并回收这些变量。
当变量进入环境(例如,在函数中声明一个变量)时,将这个变量标记为“进入环境”。当变量离开环境时,将其标记为“离开环境”。
- 引用计数
引用计数是跟踪记录每个值被引用的次数。就是变量的引用次数,被引用一次则加1,当这个引用计数为0时,被视为准备回收的对象,每过一段时间,就把被引用数为0的变量回收。引用计数可能导致循环引用,导致内存泄漏。
function problem(){
var a = new Object()
var b = new Object()
a.name = b;
b.age = a;
}
// 这样互相引用就会导致大量的内存泄漏
常见的内存泄漏
- 全局变量引起的内存泄漏
- 闭包引起的内存泄漏
- dom清空或者删除时,事件未清除
- 循环引用
垃圾回收的缺陷
js的GC策略无法避免的一个问题: GC时,停止响应其他操作。
网友评论