垃圾回收(GC) 编程语言中提供的自动的内存管理机制,自动释放不需要的内存,无需程序员手动执行
Go V1.3 标记清除算法 :暂停业务逻辑,进行扫描,标记可达不可达,最后清除不可达对象,需要长时间暂停(stw),效率极低。
Go V1.5 三色并发标记法 :
初始所有对象均为白
- 遍历根程序,将下一个可达对象标记为灰
- 遍历灰,将下一个可达对象标记为灰,自身变为黑
- 重复步骤二,直到只存在白和黑,清除白
但如果上述步骤不进行暂停操作的话,如果使黑引用白,而白的被引用又恰好消失,则会被误删
所以需要引入屏障机制,即插入写屏障,以及删除写屏障,
插入写屏障 :新加入的白色引用,直接使白色变为灰色,防止误删,但因为栈上的内存调用过于频繁,所以不适用插入写屏障,所以最后栈上的内存最后还是需要暂停进行维护
删除写屏障 :灰对白的引用如果被删除,白变灰,防止误删,如此将导致回收精度大幅度降低
Go V1.8 混合写屏障 :
1、GC开始将栈上的对象全部扫描并标记为黑色(之后不再进行第二次重复扫描,无需STW),
2、GC期间,任何在栈上创建的新对象,均为黑色。
3、被删除的对象标记为灰色。
4、被添加的对象标记为灰色。