go语言中的垃圾回收机制(gc)
引用计数法
适用于内存占用小于32kb
时使用
在每个对象内部维护一个整数值,叫做这个对象的引用计数,当对象被引用时引用计数加一,当对象不被引用(释放、置nil)时引用计数减一。当引用计数为 0 时,自动销毁对象。另外的缺陷是,每次对象的赋值都要将引用计数加一,增加了消耗。
Mark-Sweep法(标记清除法)(go早期使用)
这个算法分为两步,标记和清除。
标记:从程序的根节点开始, 递归地 遍历所有对象,将能遍历到的对象打上标记。
清除:讲所有未标记的的对象当作垃圾销毁。
三色标记法(go后来使用)
适用于内存占用大于32kb
时使用
三色标记法是传统 Mark-Sweep 的一个改进,它是一个并发的 GC 算法。
原理:
1、首先创建三个集合:白、灰、黑。
2、将所有对象放入白色集合中。
3、然后从根节点开始遍历所有对象(注意这里并不递归遍历),把遍历到的对象从白色集合放入灰色集合。
4、之后遍历灰色集合,将灰色对象引用的对象从白色集合放入灰色集合,之后将此灰色对象放入黑色集合
5、重复 4 直到灰色中无任何对象
6、通过write-barrier检测对象有变化,重复以上操作
7、收集所有白色对象(垃圾)
注意:
- write-barrier:gc运行的过程中,可以监控内存中对象的修改,并对对象进行重新标记
- 对象颜色代表的意义
- 白色:待清理对象
- 灰色:标记的中间状态
- 黑色:活跃对象,其引用对象都是灰色或黑色