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的实现原理
推荐阅读
-
萌明明说娱乐|剪完当场就后悔,搞笑GIF趣图:妹子直播剪刘海
-
-
甄嬛▲宜修从来没有对付过端妃,为何端妃却说自己像敬妃一样恨毒了她
-
「手机大魔王」手机再贵再好,也记得把微信这个设置关掉,能省下大量内存
-
-
诸葛亮借东风是怎么做到的他真的能归根到底吗,诸葛亮借东风是怎么做到的他真的能呼风唤雨吗-
-
-
-
搞笑街区|看到表姐在训表姐夫,说表姐夫傻,开心笑话:去表姐家玩儿
-
央视新闻|走向我们的小康生活丨班彦村搬出穷山窝 旧貌换新颜
-
-
-
每日经济新闻贝壳深圳站店东委员会会长黄明川:深圳将吸引更多人才加入
-
4个村屯15个变压器上铜芯电缆被盗 警方30天“连人带物”全找到
-
适合穷人的18个创业项目投资小 2021年最赚钱小生意
-
OPPO K7x 官宣 11 月 4 日发布,主要配置曝光
-
OPPO 李杰:Reno系列研发的 KPI,每一年降低 0.3mm 厚度
-
-
射手座|下半年如鱼得水的星座,贵人运爆棚,总能逢凶化吉
-
意甲|3-4!意甲最后一个降级名额诞生:38轮狂丢85球全欧洲最烂