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的实现原理
推荐阅读
-
『霍英东』霍英东长孙婚礼,五大特首全到,李嘉诚却连饭都没吃就离开
-
综艺|维嘉和海涛去卖橡胶,本以为起码能卖35,看到最后价格,俩人懵了
-
-
机器人库 「峰企」北京新联铁中标“2020年工业互联网创新发展工程”项目
-
-
三星Galaxy|小米CC10被确定,120倍变焦+5G芯片,价格更感人!
-
市场|不少外贸企业看好国内市场潜力 出口转内销 促进“双循环”
-
郭沫若|大墓中挖出稀世国宝,郭沫若欣喜若狂,周总理却冷冷说了9个字
-
黄金|文秦霸金:7.12黄金多头下周前景明朗,走势分析及原油空单解套
-
「动力」朋友推荐我买比亚迪宋PRO,13万入手了它,空间大动力足
-
体育我来评|全明星中锋有望加盟,CBA迎来大结局?朱芳雨追寻易建联接班人
-
曹操建的铜雀台在哪里-?曹操建铜雀台是为了干什么_2
-
大龙哥侃世界@回应:局面困难,只管救人,美传染病专家福奇因说真话遭死亡威胁
-
星空伴你成长:乳糖不耐受怎么办? 营养师给出三个选择
-
东契奇|绝杀!东契奇带伤43+17+13打爆乔治,快船谁能防住他?
-
大白财经观察|加码直播能否突围?,蘑菇街一季度营收降45.3%
-
-
-
军人|中国最神秘的一次行动,6万解放军机密进山,35年后才公布于世
-