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的实现原理
推荐阅读
-
-
-
微信公众号“健康广东”|广东新增境外输入确诊5例、无症状感染者8例,均为广州报告
-
古今医案研读|古今医案研读:广中医教授周福生治萎缩性胃炎伴肠化三
-
家常老干妈豆腐,不一样的麻婆豆腐,做法超简单的下饭菜,特美味
-
『中金网』布局非接触经济,佳都科技发布商用智能人脸测温新品
-
盛夏书香|我们不能只有省省省的态度,孩子看见玩具就想买?对待金钱
-
花香|在家里养盆“醉酒杨妃”花姿琼花玉叶,花香醉人,比菊花还美
-
-
本田urv|8月销量最惨的十大轿车榜单,这个品牌占5款,或将退出中国市场
-
萌主妈咪育儿经|妈妈记得要读懂,男孩为何爱“粘”妈妈?背后的心理暗示
-
-
-
高超音速|全球最快导弹亮相,15分钟直达美本土,宙斯盾都来不及反应
-
怎样看待教师在上课中夹带私货(泛指人生道理)的行为
-
真想买套小户型照着它装,既可住家又可当工作室,一人独享太爽了
-
-
-
『搞笑大喇叭』一天在路口起步熄火了,她打开双闪下了车,笑话:表姐刚拿驾照
-
开一家儿童益智玩具店怎么样 杭州巧天才玩具总部地址