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的实现原理
推荐阅读
-
我们市场上面遇到的价值上千万级别的钱币,遇到最好绕道走
-
怎样看待北京市金融业十三五规划提出建成国际金融中心上海的定位日后
-
-
-
-
【国家卫健委】欧盟向英国下“最后通牒”,英国政府“无视”了
-
款式|身材苗条不是错,但穿搭需遵循三要素,以免穿成“纸片人”!
-
『向上呀宝贝』女大却不避父”?背后原因,揭示亲子相处原则,为什么“儿大避母
-
彩云时尚编发|长裙能展现女人魅力,大裙摆款式的裙子,穿在身上就像是仙女一样
-
-
-
-
-
冰种翡翠|? 高冰种和玻璃种有何区分? 该如何准确地区分二者之间的不同?
-
美军|美军U-2擅闯当天即严正交涉,中方已保持极度克制,能否直接击落?
-
亮剑军神:俄罗斯一万八千米,歼20令人欣喜,五代机实用升限:美国两万米
-
斗玩网|虎牙S10:苏宁痛失冠军!LCK重回第一赛区,网友直呼不如现场找代打
-
巴黎潮仔|小姐姐仿妆“杨颖”,开局:以为认不清现实,结尾:粉丝都分不出
-
应急|男子一口气拍361张照片举报……,国庆堵在高速上
-