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的实现原理
推荐阅读
-
-
中国新闻网|两次任首相,连续执政时间最长,“安倍时代”将谢幕 ?
-
大众|合资B级轿车常青藤!新款大众帕萨特上市:18.19万起
-
李信|王者:一念神魔两大彩蛋,光盾唯信所有,建模图帅炸,入信不亏
-
空军|亚美尼亚称土耳其F-16战机击落亚军机 阿塞拜疆和土耳其均否认
-
孩子不脾健积食,这2种食物少给娃吃,吃的越多,孩子脾胃越弱
-
受尽|这位梁山好汉受尽家庭和职场欺辱,打仗出工不出力,最后保命升官
-
-
-
人生八苦|必看!2020养老金上涨5%!多地公布发放时间!
-
财华社|山东黄金(01787-HK)完成发行5亿人民币利率1.55%的短融券
-
自强不息的小丽|霍震霆携带全家拜别赌王,郭晶晶素面朝天穿布鞋,装扮朴素胜主家
-
股价|重组失败未影响股价涨势 紫光国微获三家机构买入5.37亿丨热公司
-
战略|第二批获批名单出炉 创业板战略配售基金增至8只
-
-
-
「杰森·斯坦森」汤唯6月1日晒出了自己女儿的近照,中韩混血又一个十足的美女胚子
-
小苏妈妈|会悄悄偷走你身体的钙,不注意怎么补都不行,3种常吃的食物
-
-
OPPO手机三星Note20系列配置引发热议,网友:国产手机随便吊打