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的实现原理
推荐阅读
-
-
-
『邓伦』《密逃2》节目组这次下血本了,包下整座大厦,邓伦吓出新表情包
-
时尚大对碰|瘦子的福利,这样穿就很特别,今年秋季火了“喇叭袖”
-
-
-
-
-
-
做法|茄子最简单好吃的做法,不用过油,水水嫩嫩鲜香下饭,全家都爱吃
-
伏魔半仙人|这几款绝版,而她在五周年能返场?,曾经免费能获取史诗级皮肤
-
-
-
不冷星球 张艺谋小31岁娇妻为儿庆生,长子张壹男才华横溢,18岁获国际影奖,
-
-
『净利润』信用卡逾期半年,第三方催收暴通讯录,上门,恐吓威胁该怎么办
-
喜数科技小陈|输球又输人!热刺1-3惨败,穆里尼奥炮轰裁判,球迷:黔驴技穷了
-
「田野牧蜂自然成熟蜜」蜂蜜绿茶的功效与作用?绿茶加蜂蜜治疗咽炎?
-
整点鲜闻|李湘直播忙带货,老公在外搂腰壁咚女友人,女生该如何保护自己?
-
『逗儿妈妈』家长巧用“登门槛效应”,培养孩子专注力,孩子做事没有“长性”