Mark: Mark objects and follow pointers 。标记所有根对象, 和根对象可以到达的所有对象不被回收 。 Mark Termination: Rescan globals/changed stack, finish mark 。重新扫描全局变量,和上一轮改变的stack(写屏障),完成标记工作 。这个过程需要STW 。 Sweep: 按标记结果清扫span目前整个GC流程会进行两次STW(Stop The World), 第一次是Stack scan阶段, 第二次是Mark Termination阶段.
- 第一次STW会准备根对象的扫描, 启动写屏障(Write Barrier)和辅助GC(mutator assist).
- 第二次STW会重新扫描部分根对象, 禁用写屏障(Write Barrier)和辅助GC(mutator assist).
从1.8以后的golang将第一步的stop the world 也取消了,这又是一次优化; 1.9开始, 写屏障的实现使用了Hybrid Write Barrier, 大幅减少了第二次STW的时间.
写屏障
因为go支持并行GC, GC的扫描和go代码可以同时运行, 这样带来的问题是GC扫描的过程中go代码有可能改变了对象的依赖树 。
例如开始扫描时发现根对象A和B, B拥有C的指针 。
- GC先扫描A,A放入黑色
- B把C的指针交给A
- GC再扫描B,B放入黑色
- C在白色,会回收;但是A其实引用了C 。
为了避免这个问题, go在GC的标记阶段会启用写屏障(Write Barrier).
启用了写屏障(Write Barrier)后,在GC第三轮rescan阶段,根据写屏障标记将C放入灰色,防止C丢失 。
参考:
Go 垃圾回收原理
Golang源码探索(三) GC的实现原理
推荐阅读
-
-
『创业者0991』呆头真是太机智了,爆笑校园:原来这才是真正的笑里藏刀
-
肿瘤|喜讯 | 简医3名医生成功入选,第十四批省卫健委学术技术带头人
-
-
「亮剑军神」具有时代意义的舰载机“雄猫”,首次实战一分钟就击落两架战斗机
-
逆光奔跑前进|BAZAAR昼夜修颜霜|黑科技时尚美妆,Harper's
-
谢贤不再隐瞒,坦言自己和张柏芝三胎关系,真的被猜中啦!
-
减肥干货,饭前二件事,饭后一坚持,懒人也能1个月瘦10斤
-
29省份前三季度“成绩单”出炉!有几个信号很明显→
-
海峡导报|崩溃!福建一男子被拍下不雅视频!竟是因为…
-
富士x100和富士x100s?富士x100s和x100v区别
-
极客力量|没有发挥出PSSD的速度?也许是你弄错了什么,原创
-
-
-
女人味|越高级的女人穿得越简约,衬衣+长裤的极简风穿搭,太有女人味了
-
现代胜达|这合资SUV不足17万,2.0T有240马力,配8AT变速箱,为何卖不动?
-
NASA正为VIPER探测器配备LED泛光灯 用于在月球黑暗的地方寻找水
-
-
央视新闻客户端|葡萄牙新冠肺炎确诊病例达43569例
-
周到|最好乘公交 自驾到野生动物园尽量避开南六公路