JavaScript学习之垃圾回收机制

116 阅读2分钟

我们创建基本类型、对象、函数……所有这些都需要内存,js解释器为他们在内存中开辟空间,当他们不再使用时,Js解释器就会将它们占用的内存空间释放掉。

Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行,而且是不可见的。

垃圾回收机制有两种主要的方法

1. 标记清除(常用的)

当一块内存中的数据能够被访问时,垃圾回收器就认为"该数据能够被获得"。不能够被获得的数据,就会被打上标记,并回收内存空间。这种方式叫作标记---清除算法。

步骤:

  • 垃圾回收器在运行的时候会给存储在内存中的所有变量加上标记。
  • 去掉当前上下文中的变量以及被上下文中的变量引用的变量的标记。
  • 在此之后再被加上标记的变量就是待删除的了。原因就是上下文结束,也就永不到了。
  • 随后垃圾回收程序做一次内存清理,销毁掉带标记的所有值,并回收他们的内存

2. 引用计数

对每一个值都记录他们的被引用次数。

流程:

  • 声明一个变量并给它赋一个引用值时,这个值的引用数就是1。
  • 如果同一个值被赋给了另一个变量,那么引用数再加1 变成2.
  • 如果给保存改值的变量赋了个其他的值。这个引用数就会减1,2-1=1。
  • 直到这个值的引用数变为0,说明这个值不可用了。
  • 垃圾回收程序下次运行时,就会释放引用次数为0的值所占的内存。

但是循环引用的值,通过这种方式是不可以被释放的。

比如:

var a={}
var b={}
a.b=b
b.a=a
// 这种循环引用的方式,是不可以被释放掉的