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的实现原理
推荐阅读
-
烹饪|立秋后,这肉跟干豆角一起炒!生津开胃还下饭,简单一炒营养美味
-
自然灾害|你做过哪些无心插柳的事?我小时候的生活经历告诉你真相!
-
新华社新媒体|全球疫情简报|美国新增100万病例仅用15天《柳叶刀》:中国抗疫经验值得学习
-
青年|离开嘉行后的李溪芮不得了,去郊游非穿“儿童衫”,还凹出蚂蚁腰
-
小C妈妈|打造“学霸脑”,要用3T原则,父母的语言直接影响孩子的“大脑”
-
-
抑郁症和抑郁情绪的区别-抑郁症和抑郁情绪有什么区别
-
-
陈瑶 |《少女大人》开播!剧情老套,陈瑶演技一如既往好评
-
新华网|世卫组织:中国以外新冠确诊病例达10448516例
-
领投智库|全年成长趋势不变,合理价值15.46 元,领益智造:业绩符合预期
-
历史|?三本历史久远的网络小说,看过其中一本的都是骨灰级老书虫
-
-
邢菲 |胡一天新剧官宣,《你好,神枪手》未播先火,搭档高颜值女主邢菲
-
-
浩室舞|脱口秀演员House道歉,表演时引用不当比喻,李诞黑历史也被扒
-
军事随身听|一女子隆胸假体拦住子弹救一命,加拿大枪击案的奇迹
-
-
李嫣|李嫣与闺蜜吃火锅,染回黑发麻花腿吸睛,为闺蜜贴心拍照现王菲同款微笑
-
小孩撒谎不做作业怎么管教呢 小孩撒谎不做作业怎么管教