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的实现原理
推荐阅读
-
潮人养一只穿的比鞋头潮、美容比名媛奢华的hypepet,是什么样的体验?
-
星座连连看吧|枯木生花,寄情相思,3星座原地等待,被前任找回,未来28天
-
-
怎么把10个word文档合并,100个word合并成一个-
-
招财猫举左手和右手的区别图片 招财猫举左手和右手的区别
-
-
冯阳|千万富翁破产后带着女儿卖冰粉!妻子出走,还负债千万
-
『YY胡』K30 Pro系列正式发布:售价最高3999元!,Redmi
-
朱迅|朱迅瘦身后气质大变,网友质疑缺乏灵性,疲惫感造型遭遇争议
-
星座趣谈E|红鸾心动,再度牵手,不离不弃的三大星座,在9月份
-
#胃癌#胃癌不是悄无声息,上厕所时发现1种“异常”,十有八九是胃癌
-
瓜瓜谈游戏一装就变弱鸡,真心驾驭不了!,“吃鸡”不适合消音器的三把武器
-
飞天小马尾|警笛头被换成路灯头了?瞬间可爱了,我的世界:5张奇怪的图片
-
『海外探客』美国3万亿救援计划无效?白宫或不惜杀鸡取卵:掠夺别国补贴自己
-
[美通社]绿叶医疗旗下曼朗医疗完成首起并购,坚定布局精神心理健康领域
-
「哈弗f7」花13.5万买辆哈弗f7,开了一个月的实际油耗,说出来你可能不信!
-
-
遮瑕|保姆级新手遮瑕教程:黑眼圈泪沟手动去除万能公式!
-
穿搭|40岁女人如何穿碎花不显老?衣Q高手孔孝真示范,不变菜市场大妈
-
青年|《创之轨迹》人物设定图公布 PS4主题预览图同步释出