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的实现原理
推荐阅读
-
-
-
比特魔方|UNITY3D、Unreal、Cocos2DX...介绍「游戏引擎」江湖的几个大玩家
-
天娱传媒|华晨宇合约到期,天娱传媒学乐华娱乐和哇唧唧哇,官宣新男团出道
-
快船|快船险胜独行侠,一场比赛显露太多问题,乔治+伦纳德并不可靠!
-
手机耗电最快的三类软件,学生党:第二类戒不了,充电也要玩
-
打野|赵云在新赛季中登场率飙升,蓝领打野或将成为版本主流
-
摩登莲子|初秋少女穿搭,休闲气质满分,别再说不会穿,这是真的洋气
-
女孩|开心一笑:堂妹相亲失败了,而且是她三十多次相亲中最失败的一次
-
-
-
-
北青网|《郭论3》《谦道2》同步上线喜马拉雅,郭德纲、于谦入驻与粉丝互动
-
-
-
口腔癌|36岁歌手傅松因口腔癌离世,10岁聋哑女儿悼念:他喝酒抽烟嚼槟榔
-
孔蒂|孔蒂,下课!临场指挥差+怒吼嚷球员,这样的他与穆里尼奥还差多远?
-
北京青年报|保姆屡对老人施暴被控虐待,当庭求饶获刑一年
-
Boos游戏解说|Cos蕾姆的“天花板”,秋楚楚不行,腐团儿一般,而她才是经典
-
服务|金融壹账通与上海银行在多领域深化金融科技合作