go三色回收

lucasgao · · 721 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

[toc]

垃圾回收的知识很早之前就了解了,现在回过头在看,发现有了新的问题,新的理解

存在的问题

  1. 为什么必须三色,二色的话会有什么问题
  2. 插入写屏障为什么不行
  3. 为什么必须使用混合写屏障,删除写屏障为什么不行。

为什么必须三色

三色具体是指:

  • 黑色。已经扫描结束的对象
  • 灰色。待扫描的对象
  • 白色。未扫描的对象

具体实现中,我们遍历灰色对象,标记为黑色。并把指向的新对象标记为灰色。

但是如果是二色的话,那么就只有黑色和白色。

那么遍历的操作是不能暂停的。因为如果恢复的话,面对黑色对象我们不知道这个是已经扫描过的还是未扫描的。

参考

  1. https://draveness.me/golang/docs/part3-runtime/ch07-memory/golang-garbage-collector/
  2. https://github.com/golang/proposal/blob/master/design/17503-eliminate-rescan.md
  3. http://wiki.luajit.org/New-Garbage-Collector

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:lucasgao

查看原文:go三色回收

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

721 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传