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的实现原理
推荐阅读
-
-
编辑|双节大长假,安全不放假!要做好疫情防护,谨防电信诈骗哦
-
-
#眼镜王蛇#世界毒王排行榜,眼镜王蛇倒数第二,被第一名刺到,30秒便死亡!
-
『』我眼中的垃圾,邻居拿来当“宝”,5元1只,1天卖出200只,厉害了
-
-
「奇点数码君」旗舰机皇驾到,骁龙855P+90Hz+50W,退场价真香
-
-
-
四川新增确诊病例1例,为菲律宾输入,新增新加坡输入无症状感染者1例
-
露娜|孤影与北慕唯一的一次solo,两大露娜之王的对决,北慕:我太菜了!
-
爱情|“心穷”的女人最可怕,身边有这3种女人,一定要远离!
-
iQOO手机美图来袭!iQOO 5 Pro处处展现超跑风范,实力不俗
-
-
穿搭|孙莉晒老公视角美照,身穿碎花衬衫配牛仔裤优雅知性,气质绝了
-
公司|华星创业易主事项收关注函 需说明朱定楷被调查是否构成交易障碍
-
央视网|美国路易斯维尔警方进入“紧急状态”准备应对抗议游行
-
封面新闻|成长的阵痛!萌娃手提尿不湿等妈妈接放学 哭到变形
-
性价比最高的国产车,价格低至6.98万,家用车的首选
-
罗志祥:确诊突破87万之际,美国突然发出战争警告,特朗普亲自发出指示