GC 就是垃圾回收机制的简写,当 GC 工作的时候它可以帮我们找到内存当中的一些垃圾对象。然后对这些空间可以进行一些释放,并且还可以进行回收分配之后方便后续的代码继续去使用。
GC 里的垃圾是什么?
-
程序中不再需要使用的对象:从程序需求的角度来考虑如果某一个数据在使用完成过后,上下文里面不再需要去用到它,就可以把它当作是垃圾来看待。例如代码当中的 name ,当函数调用完成以后在这里其实已经不再需要使用 name 了,因此从需求的角度来考虑。它应该被当作垃圾进行回收的,至于说到底有没有被回收呢现在不做讨论;
function func () { name = 'leo' return `${name} is a coder` } func() -
程序中不能访问到的对象:从当前程序运行过程中这个变量还能否被引用到的角度去考虑,例如下面案例中依然是在函数内部定义了一个 name 。不过这次在变量前面加上了一个声明变量的关键字,有了这样的一个关键字以后。当函数调用结束之后,在外部的空间当中就不能够再访问到这个 name 了。所以当我们找不到它的时候,其实它也可以算作是一种垃圾。
什么是 GC 算法?
GC 其实就是一种机制,它里面的垃圾回收器可以去完成具体的回收工作。而工作的内容本质就是查找垃圾、释放空间并且回收空间,所以说在这个过程当中就会有这么几个行为:
- 如何去查找垃圾
- 在释放空间的时候又改怎样去释放
- 回收空间的过程中又如何去进行分配
所以这样一系列过程的里面,必然有不同的方式。所以说 GC 的算法,就可以理解为是上述的垃圾回收器在工作过程中所遵循的一些规则,好比就是一些数学公示。
- GC 是一种机制,垃圾回收器完成具体的工作
- 工作的内容就是查找垃圾释放空间、回收空间
- 算法就是工作是查找和回收所遵循的规则
常见的 GC 算法:
- 引用计数:通过一个数字来判断当前的这样一个对象是不是一个垃圾;
- 标记清除:可以在 GC 工作的时候去给到那些活动对象添加上一个标记,来判断它是否是一个垃圾;
- 标记整理:与标记清除其实很类似,只不过后续回收的过程中会做出一些不一样的事情;
- 分代回收:将来在 V8 当中会用到这样的一个回收机制;