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的实现原理
推荐阅读
-
『碱性食物』5月,“碱性食物之王”被找到,常吃嘴巴不臭,头发乌黑,牙齿好
-
尼莫妈妈日记|继承妈妈的美貌,堪称最美星二代,有种“遗传”叫邱淑贞女儿
-
-
迷人|街拍:蕾丝连衣裙小姐姐,穿出女性优雅迷人的魅力
-
运势▲3号4号好运从天降,2天内百万钱财赚不停,由穷变富大转运3生肖
-
-
全球疫情@世卫组织:全球新冠肺炎确诊病例新增219983例
-
-
菅义伟|菅义伟下台风波愈演愈烈,一个更坏消息传来,引发全球高度关注
-
『梵古』黑色过膝A字裙怎么搭配能穿出休闲风?这几款穿搭方式建议收藏
-
-
-
「钱江晚报小时新闻」很多人都已经这么做了……,扫码送美食!五一小长假
-
石头|新疆发现一种石头,毒性十分强烈,专家:比稀土还要珍贵!
-
-
「华为」任正非终于“出手”!华为突宣“生二胎”?鸿蒙或将彻底“失宠”?
-
|张檬金恩圣将举办婚礼,现场彩排照片曝出,两人穿情侣装满脸笑容
-
密云水库|为密云水库“60岁庆生”,上游两市三区联手组成“保水共同体”
-
-