Golang的GC算法
Golang的GC算法
算法里程碑:
- v1.1 STW
- v1.3 Mark STW, Sweep 并行
- v1.5 三色标记法
- v1.8 hybrid write barrier
STW:Stop The World
就是runtime把所有的线程全部冻结掉,所有的线程全部冻结意味着用户逻辑是暂停的。这样所有的对象都不会被修改了,这时候去扫描是绝对安全的。
写屏障:该屏障之前的写操作和之后的写操作相比,先被系统其它组件感知。通俗的讲:就是在gc跑的过程中,可以监控对象的内存修改,并对对象进行重新标记。(实际上也是超短暂的stw,然后对对象进行标记) 例:一个黑色对象引用了曾经标记的白色对象,WB就会触发,向GC发送信号,GC重新扫描对象并标记为灰色。
三色标记法
第一部分:
- 程序创建的对象都标记为白色
- 扫描所有可到达的对象,标记为灰色
- 从灰色对象中找到引用对象,保持灰色,被引用的对象标记为黑色
- 监视对象中的内存修改,并持续上一步的操作,直到灰色标记不存在
第二部分
- 回收白色对象
- 最后将所有白色对象变为白色,并重复以上所有过程
增量式垃圾回收:在STW期间完成部分垃圾对象的标记,然后结束STW继续执行用户线程,一段时间后再次执行STW再标记部分垃圾对象,这个过程会多次重复执行,直到所有垃圾对象标记完成。(分散标记,最大暂停时间变短)
并发垃圾回收:先STW找到所有的Root对象,然后结束STW,让垃圾标记线程和用户线程并发执行,垃圾标记完成后,再次开启STW,再次扫描和标记,以免释放使用中的内存。(不会暂停用户线程,同时降低了STW的时间)