我们创建基本类型、对象、函数……所有这些都需要内存,js解释器为他们在内存中开辟空间,当他们不再使用时,Js解释器就会将它们占用的内存空间释放掉。
Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行,而且是不可见的。
垃圾回收机制有两种主要的方法
1. 标记清除(常用的)
当一块内存中的数据能够被访问时,垃圾回收器就认为"该数据能够被获得"。不能够被获得的数据,就会被打上标记,并回收内存空间。这种方式叫作标记---清除算法。
步骤:
- 垃圾回收器在运行的时候会给存储在内存中的所有变量加上标记。
- 去掉当前上下文中的变量以及被上下文中的变量引用的变量的标记。
- 在此之后再被加上标记的变量就是待删除的了。原因就是上下文结束,也就永不到了。
- 随后垃圾回收程序做一次内存清理,销毁掉带标记的所有值,并回收他们的内存
2. 引用计数
对每一个值都记录他们的被引用次数。
流程:
- 声明一个变量并给它赋一个引用值时,这个值的引用数就是1。
- 如果同一个值被赋给了另一个变量,那么引用数再加1 变成2.
- 如果给保存改值的变量赋了个其他的值。这个引用数就会减1,2-1=1。
- 直到这个值的引用数变为0,说明这个值不可用了。
- 垃圾回收程序下次运行时,就会释放引用次数为0的值所占的内存。
但是循环引用的值,通过这种方式是不可以被释放的。
比如:
var a={}
var b={}
a.b=b
b.a=a
// 这种循环引用的方式,是不可以被释放掉的