强烈建议看这篇英文文档
一、什么是垃圾
- 没有被引用的对象很可能是垃圾。
- 之所以说可能是因为有特例,那就是如果三个对象互相被引用,也只是他们仨之间互相被引用,形成一个环一个孤岛,虽然这三个对象被引用了这样也算是垃圾
- 具体的
- window不是垃圾
- 全局变量不是垃圾
- 一个函数中的局部变量在这个函数执行后就成了垃圾
- 单变量对象,也就是一个对象被一个变量引用了。在这个变量被重新赋值之后,这个对象就不被任何变量所引用了,这个对象就是垃圾了
- 双变量对象,也就是一个对象被两个变量都引用了。如果其中一个变量被重新赋值了,那么这个对象还是被另一个变量引用,所以这个对象不是垃圾
二、垃圾回收算法
(一)标记清除算法
- 从全局对象开始,把它引用的所有对象都标记一下。
- 遍历所有被标记的对象,去标记他们引用的对象。
- 以此类推,直到找不到新的可以被标记的对象。这样,标记过程就算结束了。
- 可以开始清除了:把所有没有标记过的对象都清除掉。
(二)引用计数 Reference Counting
引用计数,就是记录每个对象被引用的次数,每次新建对象、赋值引用和删除引用的同时更新计数器,如果计数器值为0则直接回收内存。 很明显,引用计数最大的优势是暂停时间短
- 优点
- 可即刻回收垃圾
- 最大暂停时间短
- 没有必要沿指针查找, 不要和标记-清除算法一样沿着根集合开始查找
- 缺点
- 计数器的增减处理繁重
- 计数器需要占用很多位
- 实现繁琐复杂, 每个赋值操作都得替换成引用更新操作
- 循环引用无法回收
作者:holysu
链接:https://www.jianshu.com/p/a8a04fd00c3c
来源:简书