Golang GC

Golang GC 整理

Go GC

  1. STW,stop the world,启动写屏障,保证在标记期间新建的对象改变了依赖但不会被误清除,
  2. 标记可达的根对象为灰色
  3. start the world。
  4. 遍历标记的对象队列,将队列里对象的子节点标记为灰色,将原对象标记为黑色,放入黑色对象队列
  5. 循环执行4,直到没有灰色对象
  6. STW
  7. 禁用写屏障
  8. 这个时候只剩下白色对象和黑色对象,删除白色对象
  9. start the world

写屏障

因为 go 支持并发 GC, 所以GC的扫描和go代码可以同时运行,这样就会产生GC扫描的过程中go代码修改了对象的依赖树。
例如:

  1. 刚开始扫描时发现有对象A和B,B引用了C,
  2. GC先扫描A,将A标记为黑色
  3. 此时B将C的指针交给了A
  4. 然后扫描B,将B标记为黑色
  5. C最后是白色,会被回收掉,但实际上A引用了C

所以写屏障会在标记的时候将C放入灰色,防止被误清除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值