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的实现原理
推荐阅读
-
-
-
树脂|医用手套原料糊树脂价格还会涨吗?四连板后新疆天业开始提示风险
-
iQOO手机120W超级闪充是个什么概念,iQOO官方放出信息即将量产
-
王嘉尔|退休老人发布baby婚变带走全部财产等内容成被告,本人亲自出庭
-
-
iOS 17 苹果地图可下载区域数据包,支持离线导航
-
-
陈向伟▲才知道102斤与86斤的区别,颜值与体重的重要性了!,看到杨紫和赵丽颖同框
-
-
足球|他是来自贫民窟的足球天才,26岁时达事业巅峰,现身价达6亿美金
-
『理科状元』我国高考史上分数最高的三个人:均是其貌不扬,现状与普通人无异
-
宝贝听听|新型婆媳关系迅速走红,80后向90后传授婆媳相处经验遭嘲讽
-
为啥|饭店的鲫鱼汤为啥好喝原来多做了这几步,怪不得汤白肉鲜又好喝
-
北京万宁|北京万宁部分门店关闭 美妆连锁陷入群体困境
-
晚池|不至于再输杨戟吧,CCTV5+直播大连人VS建业!贝尼特斯输给李霄鹏
-
市场|两融余额即将冲击2015年牛市峰值,这些个股被融资客买爆了
-
苹果手机iPhone12与12Pro价格相差2200元,用户该怎么选择?
-
天无■湖北省卫健委:连续5天无新增确诊病例 尚在接受医学观察1526人
-
烹饪|学会这几种面条,一天一碗不重样,不爱吃的孩子一顿也能吃两碗!