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的实现原理
推荐阅读
-
雷神之锤|坚持在高原修建野战机场,宁可让坠机惨案频发,印军无视血泪教训
-
-
『多视点眼科小知识』发热眼罩别乱用,不小心结膜炎就会找上你
-
-
中新经纬|天音控股大涨9.86%,领涨专业零售板块
-
-
老抽、生抽、豉油、蚝油到底怎么用?做菜高手可能都不知道……
-
山药最近火了,教你好吃做法,比包子简单,老婆天天想吃,太香了
-
上升星座|6/20-6/26 星座周運(參考星座: 上升星座)
-
1000块钱可有创业的可能(有闲置门面),都有哪些
-
飞翔数码科技|彩屏配置,随时随地打理精致面容,须眉科技上新小钢鲨
-
-
石油|伊朗与美元作出正式了断后,两国经济或将由穷转富,8国或将效仿
-
-
舒服|韩国小个子欧尼超舒服的气质搭配,显高时髦,简约不挑人!
-
[平安商丹]【全警大练兵】高新公安分局开展全警大练兵警体达标测试
-
-
-
小儿健康|低层次父母就是不断地给孩子讲道理,而高层次父母,则用3种方法
-