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的实现原理
推荐阅读
-
-
@在五月出门巧遇贵人,求财一顺百顺,迎幸福生活,没有烦恼的属相!
-
考试|《她们的名字》:不仅有职场较量,还有婆媳关系,故事刻画的过于真实
-
思思星座谈|旧情尚存,心有执念,前任回归,深情依旧的四大星座,在未来一周
-
【北京国安】国安未来的重点关注对象,实力几乎没有短板,完全能堪以重用
-
三口之家年收入20万左右在中国算是一个啥样的水平 ?
-
雷科技 手机真的需要这种创新吗?,屏幕可以90度旋转
-
猪猪甘|梁爽被小三,怒扇渣男霸道划豪车分手,宿舍里每个失恋女孩的缩影
-
「手机之家」高规格大底 Sensor+ 专业算法 Find X2 Pro 影像到底有多强?
-
-
『新闻热点』 县委书记变身“店小二” 网上卖百合引百万网友“围观”,
-
川藏线@川藏线上滚轮胎那么累,为啥有人愿意做?半个月就能买大G
-
张殿成军情观察|不料被导弹击落 尼泊尔拒绝释放飞行员,印军战机突然发动空袭
-
-
电竞大指南|打个游戏还能赢金条?这可是真金白银!人手一个金元宝!
-
54岁彭羚现身林海峰演唱会,打扮素朴皱纹明显,状态真实优雅老去
-
停车楼|378个车位!颜值爆表!东莞中心城区这个停车楼本周动工!
-
[男爵说]对比《大赢家》和《率性而活》,我认为大鹏更中国!,看中韩电影
-
ACG次元饭@生意肯定不会差,ACG最靓Coser第2期:有这样的女仆当服务生
-