Go语言GC | 青训营笔记

218 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第二篇笔记。

写作背景

好奇为什么go语言能在中国发展这么快,大家口传它性能很强,那其中之一的表现就是GC。让我们一起看看go语言的GC究竟怎么实现高性能呢。

参考资料

Golang中GC回收机制三色标记与混合写屏障 刘丹冰大佬的系列视频很生动形象讲解go语言的GC

正文

Go语言的GC叫三色标记与混合写屏障,什么是三色标记与混合写屏障呢?我们一步一步讲解

三色标记

三色标记顾名思义就是有3种颜色标记项目中的文件,分别是黑白灰,黑色代表有用的文件,灰色代表被引用的文件,白色代表垃圾文件将被清楚。通过三色标记法能有效地区分出程序的垃圾文件。但是整个过程都需要STW,效率极低。

混合写屏障

插⼊屏障:

对象被引⽤时 触发的机制 具体操作: 在A对象引⽤B对象的时候,B对象被标记 为灰⾊。(将B挂在A下游,B必须被标记为灰⾊)满⾜: 强三⾊不变式. (不存在⿊⾊对象引⽤⽩⾊对象的 情况了, 因为⽩⾊会强制变成灰⾊)不⾜结束时需要STW来重新扫描栈,⼤约需要10~100ms

删除屏障

对象被删除时 触发的机制具体操作: 被删除的对象,如果⾃身为灰⾊或者⽩⾊,那么被标记为灰⾊。 满⾜: 弱三⾊不变式. (保护灰⾊对象到⽩⾊对象的路径不 会断)不⾜回收精度低, ⼀个对象即使被删除了最后⼀个指向它的指针也依旧可以活过这⼀轮, 在下⼀轮GC中被清理掉。

二者合一

实现: 栈空间不启动,堆空间启动, 整体过程⼏乎不需要STW, 效率较⾼