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的实现原理
推荐阅读
-
-
孩子14岁16岁18岁的意义?12岁,14岁,18岁的三个阶段
-
-
「小蜜疯汽车」现场正在进行回填!附近临时交通管制,广州东晓南路段发生地陷
-
-
-
iambillbil|金河田魔术师SUPER如何做到小身材大空间!
-
-
-
投资|银保监会印发《组合类保险资产管理产品实施细则》等三个细则
-
-
韩庚|赵丽颖带儿子游玩,背五位数大牌包扎马尾像少女,2000外套却村味
-
蒙面唱将猜猜猜|蒙面唱将:黄霄云赵露先后揭面,尤长靖成功藏到下一期
-
山东省|这八所二本大学分数不高!城市不错!性价比高!中等生请看过来!
-
星座卿初阳|但最受欢迎的3个星座女,追到你一定很优秀!,最难追
-
MiyaShare|不懂护肤就别瞎补水!冬季护肤做好这件事:皮肤越来越好,太实用
-
-
家里万万要养这几种植物,聪明人都懂,难怪家人身体越住越健康
-
国产|CNNIC:国内实现7nm芯片试产 网友:希望Mate60用上国产芯片
-
标杆|2020电竞上海大师赛圆满落幕 为城市赛事树立新标杆