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的实现原理
推荐阅读
-
水星|秋冬裤装如何穿搭?适合职场的裤装搭配示范,简约大方利落干练
-
万历时十五年在线阅读|万历时十五年在线阅读答:世人对世间万物的认知
-
女生喜欢什么样的男生(大多数女生喜欢什么样的男生)
-
Lava Lava店铺音乐,点燃训练激情,燃烧卡路里
-
-
-
『举行』四川西昌市经久乡森林火灾遇难勇士追悼会在西昌举行
-
鸿图之下|【攻略】《鸿图之下》个人势力如何升级,最快提升个人势力方法
-
萌娃小包子|这4件事要靠妈妈,爸爸不管用,倒数第一逆袭清华:养育男孩
-
-
-
-
-
【奇星坊】世界上唯一造型奇特的大楼:直立长度达4000英尺
-
新氧美容APP|吊打鞠婧祎的真·四千年美少女,方脸甜到极致的美貌是开挂了吧!
-
中国新闻网|工信部:疫情中软件业务收入同比增长8.6%
-
袁隆平|市民在医院门口摆三束水稻告慰袁老:长沙市民鸣笛送别袁隆平
-
-
英雄联盟|英雄联盟无限乱斗模式你认为哪个英雄最弱,为什么?
-
顺义|这6所211大学,只要考上一点不比985大学差,毕业后根本不愁就业