- 第一次STW会准备根对象的扫描, 启动写屏障(Write Barrier)和辅助GC(mutator assist).
- 第二次STW会重新扫描部分根对象, 禁用写屏障(Write Barrier)和辅助GC(mutator assist).
写屏障
因为go支持并行GC, GC的扫描和go代码可以同时运行, 这样带来的问题是GC扫描的过程中go代码有可能改变了对象的依赖树 。
例如开始扫描时发现根对象A和B, B拥有C的指针 。
- GC先扫描A,A放入黑色
- B把C的指针交给A
- GC再扫描B,B放入黑色
- C在白色,会回收;但是A其实引用了C 。
启用了写屏障(Write Barrier)后,在GC第三轮rescan阶段,根据写屏障标记将C放入灰色,防止C丢失 。
参考:
Go 垃圾回收原理
Golang源码探索(三) GC的实现原理
推荐阅读
- PHP+Nginx部署配置文件正确优化改良详解
- 详解冰箱压缩机工作原理 电冰箱压缩机
- 详解冻顶乌龙茶制作的四个阶段
- JavaScript原型详解
- 冬季养生知识详解
- 一口价黄金回收还值钱吗 一口价黄金卖得出去吗
- 吸管是可回收还是不可回收 麦当劳塑料杯算可回收吗
- 免费上门回收旧床垫 旧床垫可以卖废品吗
- Python中的列表、元组、集合和字典详解
- 净水器滤芯大全 小米净水器滤芯能回收再利用吗
