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的实现原理
推荐阅读
-
-
强迫症|你见过“强迫症”是如何吃东西的吗草莓要去籽,冷饮要压平
-
-
王宏伟|曾登8次春晚的王宏伟,选妻子唯一要求,让守寡48年的母亲满意
-
家有汽车|汉兰达霸主地位岌岌可危,美系发力大7座SUV
-
|开车路遇这3种车牌要记得避开,很多车主不明白吃了亏
-
【】俄总统新闻秘书:俄方愿就纳瓦利内疑似中毒事件与德国全面协作
-
汽湃|买菜品牌出的超跑长啥样?丰田:不好意思让你们久等了!
-
中国体彩报|但球员选择国米,迪马济奥:拜仁曼城都愿为阿什拉夫付6000万
-
主持人|六大看起来减肥的食物,实际却越吃越胖,你清楚吗?
-
贝壳|两性关系中,让男人爱到“上瘾”的女人,通常有三个过人之处
-
何为鲸落,一头鲸的死亡造就一个深海生态系统 近百头鲸集体搁浅海滩死
-
-
华翔热点聆听|看到这种手提袋请远离!多名女性“中招”被偷拍
-
-
Amy爱设计|凡是来过我家的亲友和邻居,进门看到客厅后都想学我家,晒晒新房
-
手机中国|T10系列曝光:搭载麒麟710 共两个版本,华为MatePad
-
问董秘|3月20日就进行了首笔回购,而贵公...,投资者提问:恒力3月17日通过回购方案
-
中国军备|又一架米格-21被击落,印军在南亚颜面无存,这次动手的不是巴基斯坦
-
娱乐扒姬|郭富城出席活动高调护妻,直言:她很有天分,方媛跳舞被群嘲