Go GC垃圾回收笔记(三色标记)

Go GC垃圾回收笔记

Go 1.3

标记清除法
  • 进行STW,从main函数开始查找内存占用(根可达算法遍历)。

  • 标记所有可以到达的内存占用。

  • 标记完成后,清除这些内存占用。

  • 结束STW,程序继续运行。

Go 1.5后

三色标记法
  • 从根部(main函数)开始查找根可达对象,将这些可达对象标记为灰色,并放入灰色对象队列。
  • 从灰色对象队列中取出灰色对象,并将其标记为黑色。同时将其引用的对象标记为灰色,放入灰色对象队列中。

重复以上两个步骤,直到灰色对象队列为空,此时剩下的所有黑色对象就是正在被使用的对象,所有白色对象就是要被清理的垃圾对象。

三色标记法+混合写屏障
  • 初始化GC任务,包括开启写屏障和辅助GC,收集根对象。 这个阶段需要进行STW(Go 1.8后这一步的STW被取消了)。

  • 扫描所有对象,包括全局指针和协程栈上的指针,(第一次扫描)扫描对应协程栈时需停止该协程(停止时间较短),执行三色标记,清空灰色对象队列,完成标记。 这个阶段在后台执行。

  • 由于在三色标记的过程中可能会有新的对象加入,所以需要写屏障来记录这些新加入的对象。在三色标记完成后,重新扫描全局变量、指针和协程栈(第二次扫描),比对两次扫描结果,判断新加入的对象中是否有垃圾对象,或第一次扫描标记的白色对象中是否有被重写引用的,如果有,则将其重新标记为灰色,防止其被清除。此阶段需要进行STW。

  • 按照标记结果回收所有的白色对象,这个阶段在后台执行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值