GC算法其实大致上分三类:1、标记清除,2、标记复制,3、标记压缩。其中Java中这三种算法都有使用到,但是go目前只用了第一个mark-sweep。这三种算法各有优缺点,第一个算法不需要移动内存,第二个算法适用于内存中大部分对象死亡过快,第三个算法适用于对象更新慢,但是对于内存连续性要求高的。
什么是三色算法
**三色标记法(tricolor mark-and-sweep algorithm)**是传统 Mark-Sweep 的一个改进,和Java的cms不一样,它更多的利用的是空间换时间
三色算法的流程
- 首先创建三个集合:白、灰、黑。
- 将所有对象放入白色集合中。
- 然后从根节点开始遍历所有对象(注意这里并不递归遍历),把遍历到的对象从白色集合放入灰色集合。
- 之后遍历灰色集合,将灰色对象引用的对象从白色集合放入灰色集合,之后将此灰色对象放入黑色集合
- 重复 4 直到灰色中无任何对象
- 通过write-barrier检测对象有变化,重复以上操作
- 收集所有白色对象(垃圾)
三色算法的缺点
可能程序中的垃圾产生的速度会大于垃圾收集的速度,这样会导致程序中的垃圾越来越多无法被收集掉。 读写屏障的难度!