概念
垃圾回收机制
为了保证浏览器运行正常,需要对其内存进行管理,而JavaScript的垃圾回收机制原理就是:找出不在继续使用的变量,释放这部分变量所占用的内存,垃圾回收器会按照固定的时间间隔进行此操作
实现方式
标记清除
原理
变量进入某一个环境后,将该变量标记为”进入环境”,当变量离开该环境时,再将该变量标记为”离开环境”,垃圾回收器将标记为”离开环境”的变量占用内存回收
实现方式
用变量的某个特殊位来记录变量状态,或者使用一个变量列表跟踪”离开环境”的变量
例子
1 | function getName() { |
引用计数
原理
记录每个值的被引用次数,当给一个变量赋某个引用类型值后,该值的引用次数为1,若又给另一个变量赋值,该值的引用次数相应的+1,若第一个变量被赋予了新值,那么旧值的引用次数相应的-1,当该值的引用次数变为0后,由垃圾回收器进行回收
例子
1 | function getName() { |
循环引用
使用引用技术容易引起一个问题:循环引用,在一个变量中A引用了另一个变量B,同时B引用了A1
2
3
4
5
6
7function cyclic() {
var objectA = {}; //对象A的引用次数为1
var objectB = {}; //对象B的引用次数为1
objectA.toB = objectB; //对象B的引用次数为2
objectB.toA = objectA; //对象A的引用次数为2
}
IE中有一部分对象不是JavaScript原生对象,它的BOM、DOM对象是使用C++以(Component Object Model)的形式实现,而COM对象的垃圾回收机制是采用引用计数方式,为了解决IE中的两种垃圾回收算法并存所导致的问题,IE9将BOM、DOM转变为真正的JavaScript对象
触发时机
垃圾回收器是周期性运行的,而这个触发机制根据不同的浏览器有不同的实现,而且在垃圾回收期间会阻塞JavaScript运行