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的实现原理
推荐阅读
-
穿越火线|全员发力!eStar.K连续横扫Q9.Y、SNS,小组头名出线
-
-
IT之家|vivo s7将于8月3日发布 刘昊然代言此超轻薄自拍手机
-
篮球教学论坛|广东队两场净胜101分!领先30分还得挨骂!杜锋真的很严格
-
美容|女团门面担当:张艺凡从不化浓妆,原因竟是驾驭不了“恶魔妆”?
-
金牛座|分手时恋恋不舍的星座,情断意不断,时常会想起对方!
-
演唱会|张信哲,张靓颖演唱会出演出事故,被高喊退票
-
-
生命时报:武汉从“人等床”到“床等人”,援鄂医生解密抗疫王牌武器
-
全国党媒信息公共平台|宝鸡市召开市中医医院暨市政重点项目建设推进会
-
上市20年,这位互联网 “老炮儿”,是时候乘风破浪了!
-
-
-
-
丹妮妈咪|一个在美国长大,一个在中国长大,20年后差距明显,双胞胎遭遗弃
-
新车猛料|外观更具现代感,全新一代红旗L系列谍照曝光
-
-
辽东春秋|曾因酒驾入狱3个月,央视前主持人郎永淳发文曝喜讯
-
洋哥爱生活|脸红是你,心跳是你,不舍前情,全力追寻,找回挚爱伴余生,下周
-
「邓锄头挖科技」想紧跟“新基建”风口?了解一下数据中心“十大选址原则”