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重新扫描对象并标记为灰色。

三色标记法

第一部分:

  1. 程序创建的对象都标记为白色
  2. 扫描所有可到达的对象,标记为灰色
  3. 从灰色对象中找到引用对象,保持灰色,被引用的对象标记为黑色
  4. 监视对象中的内存修改,并持续上一步的操作,直到灰色标记不存在

第二部分

  1. 回收白色对象
  2. 最后将所有白色对象变为白色,并重复以上所有过程

增量式垃圾回收:在STW期间完成部分垃圾对象的标记,然后结束STW继续执行用户线程,一段时间后再次执行STW再标记部分垃圾对象,这个过程会多次重复执行,直到所有垃圾对象标记完成。(分散标记,最大暂停时间变短)

并发垃圾回收:先STW找到所有的Root对象,然后结束STW,让垃圾标记线程和用户线程并发执行,垃圾标记完成后,再次开启STW,再次扫描和标记,以免释放使用中的内存。(不会暂停用户线程,同时降低了STW的时间)