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的实现原理
推荐阅读
-
-
央视网|英医学专家:新冠肺炎重症康复者患创伤后应激障碍风险高
-
游戏探险家|魔兽怀旧服:狂暴战必须用狮心头盔?其实这样配装兼顾输出和生存
-
-
联发科|联发科天玑600首曝:还未出世 已接到大量订单
-
-
金徽酒:2020年半年实现营收7.12亿元,净利润1.2亿元
-
-
燕赵都市报冀东版■唐山市人民医院麻醉科开展“中国麻醉周”宣传活动
-
极客小七资讯号半导体行业新突破:国产大容量闪存实现量产,三星不再是唯一选择
-
-
『郝海东』恩怨难以化解,郝海东凌晨2点怒怼球迷:后浪再努力顶多就是蛹
-
体坛曾说过|未来更大动作,骄傲!恒大足校圆7人欧洲足球梦
-
iNews新知科技|电竞助力下的苏宁双十一:好事正在发生S10:赛场内外,赢在电竞双十一:粉丝经济,苏宁成“年轻的黑马”
-
-
-
第一心理|心地越善良的人,命越不好,心理学:请收起你的善良
-
-
盘点斗破苍穹想成为萧炎“小妾”的4位美女,一人曾经是正室!
-