目前常见的垃圾回收机制主要是:标记清除法 和引用计数法。
标记清除法
- 垃圾收回指的是在内存中释放无效占用的内存,而不仅仅是说销毁对应的变量。
- 每次清除时,会先排除全局变量和闭包变量的内存,其余的都是可以释放的垃圾内存。
- 每隔一段特定的时间间隔就进行一次收回。
- 目前各大浏览器基本都是采用这种方法进行垃圾回收,不过标记方法和时间间隔有所不同。
function test1() {
var a = 1 // 进入环境
console.log(a) // 输出 1
}
test1() // 离开环境,释放 test1 内存,a 销毁
console.log(a) // 报错,未定义该变量
引用计数法
- 通过统计内存的引用次数,当内存引用次数为 0 时,销毁回收该内存资源。
- 存在循环引用问题,目前很少用到这种方法作为辣鸡回收机制。
正常情况下:
function test2() {
var a = {} // a 引用次数为 1
var b = {} // b 引用次数为 1
var c = a // a 引用次数 +1 = 2
var c = b // a 引用次数 -1 = 1, b 引用次数 +1 = 2
}
test2()
循环引用问题:
function test2() {
var a = {} // a 引用次数为 1
var b = {} // b 引用次数为 1
// 循环引用,a 和 b 的引用次数会不断增加,导致内存无法释放
a.prototype = b // b++
b.prototype = a // a++
// 人为去解决循环引用问题
a = null
b = null
}
test2()