美文网首页Go语言
Go垃圾回收之三色标记算法

Go垃圾回收之三色标记算法

作者: 灰常出色 | 来源:发表于2020-01-30 16:20 被阅读0次

转自公众号“灰子学技术”,原文链接:https://mp.weixin.qq.com/s/SFJoSSbvv3KyYKz4osUnFw

三色标记法介绍:

三色标记法(tricolor mark-and-sweep algorithm)是传统 Mark-Sweep 的一个改进,它是一个并发的 GC 算法,在Golang中被用作垃圾回收的算法,但是也会有一个缺陷,可能程序中的垃圾产生的速度会大于垃圾收集的速度,这样会导致程序中的垃圾越来越多无法被收集掉。原理如下所示:

step 1: 创建:白、灰、黑 三个集合。

step 2: 将所有对象放入白色集合中。

step 3: 从根节点开始遍历所有对象,把遍历到的对象从白色集合放入灰色集合(备注:这里放入灰色集合的都是根节点的对象)。

step 4: 遍历灰色集合,将灰色对象引用的对象(备注:这里指的是灰色对象引用到的所有对象,包括灰色节点间接引用的那些对象)从白色集合放入灰色集合,然后将分析过的灰色对象放入黑色集合。

step 5: 直到灰色中无任何对象。

step 6: 通过写屏障(write-barrier)检测对象有变化,重复以上操作(备注:因为 mark 和用户程序是并行的,所以在上一步执行的时候可能会有新的对象分配,写屏障是为了解决这个问题引入的)。

step 7: 收集所有白色对象(垃圾)。

例子如下所示:

 1. 初始阶段,假设当前的对象调用情况如下所示,root ->A->B/A->C/A<->D;root->F; E; G->H;

根据算法,会将所有的对象都放到白色集合当中,对应于step 1和step 2。

2. GC开始扫描,这里会从根节点开始,遍历发现只有A和F是根节点,于是将A、F从白色集合移动到灰色集合当中,在白色结合中之后剩下B、C、D、E、G、H这些节点,对应于step 3。

3. GC继续扫描灰色集合,会将灰色集合中的节点中引用的节点移动到灰色集合当中,本例中A节点引用的节点B、C、D会被移动到灰色集合中,紧接着A发现自己引用的所有子节点都已经在灰色集合了,便会被移动到黑色集合中,同时F节点没有自节点,也会被移动到黑色集合当中,对应于step 4。

4. GC会循环遍历灰色集合,直到灰色集合之中没有节点为止,在本例中,发现B、C、D都没有子节点在白色集合中,便将B、C、D都移动到黑色集合中,对应于step 5。

5. 此时只剩下E、G、H在白色集合中,剩下的对象都在黑色集合中,GC便清除白色集合中的对象,也就是进行回收这些对象,对应于step 7。

6. 上面的垃圾回收结束之后,GC会在进行一步操作,也就是将黑色集合变色成白色集合,供下一次垃圾回收使用。

参考文档


一张图了解三色标记法:http://idiotsky.top/2017/08/16/gc-three-color/

golang里gc相关的write barrier(写屏障)是个什么样的过程或者概念?:https://www.zhihu.com/question/62000722/answer/193462425

02.2跟雨痕看go源码- 并发清理与三色标记:https://blog.csdn.net/bairongdong1/article/details/52216360

Go的三色标记GC:https://segmentfault.com/a/1190000012597428

Golang GC(垃圾回收) - 三色标记算法:https://juejin.im/post/5c62d45ee51d457fa44f4404

Golang’s Real-time GC in Theory and Practice:https://making.pusher.com/golangs-real-time-gc-in-theory-and-practice/

Garbage Collection In Go : Part I - Semantics:https://www.ardanlabs.com/blog/2018/12/garbage-collection-in-go-part1-semantics.html


灰子学技术:

相关文章

  • Go垃圾回收之三色标记算法

    转自公众号“灰子学技术”,原文链接:https://mp.weixin.qq.com/s/SFJoSSbvv3Ky...

  • golang sync .pool

    Go 是一个自动垃圾回收的编程语言,它的算法我们后续会讲到,主要就是采用三色并发标记算法标记对象并回收。我们可以不...

  • 垃圾回收算法、回收机制与总结 ---JVM

    垃圾回收算法、回收机制与总结 ---JVM 一、垃圾回收算法 1.标记清除 标记--清除算法将垃圾回收分为两个阶段...

  • GC原理,有哪几种GC方式?

    标记-清除 算法 引用计数法 复制算法 标记-压缩 算法 分代垃圾回收 增量式垃圾回收算法 RC Immix 算法

  • 垃圾回收-GC

    1. 垃圾回收算法 垃圾回收算法包括引用计数算法、标记整理、标记复制、标记清除。 1). 引用计数算法 引用计数算...

  • Go面试题

    1、简述 Go 语言GC(垃圾回收)的工作原理 Go1.3采用标记清除法, Go1.5采用三色标记法,Go1.8采...

  • JVM系列(四):浅谈常用四种垃圾回收算法总结!

    常用四种垃圾回收算法 常用的垃圾回收算法有四种:标记-清除算法、复制算法、标记-整理算法、分代收集算法。 1.标记...

  • JVM 垃圾回收算法

    JVM的4种垃圾回收算法、垃圾回收机制与总结 1.标记清除 标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶...

  • JVM的4种垃圾回收算法、垃圾回收机制与总结

    垃圾回收算法 1.标记清除 标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。 在标记阶段首先通过根节点(...

  • Java垃圾回收算法

    垃圾回收算法分类 标记-清除算法 该算法分为「标记」与「清除」两个阶段. 标记-清除算法最基本的回收算法.后序的算...

网友评论

    本文标题:Go垃圾回收之三色标记算法

    本文链接:https://www.haomeiwen.com/subject/oecithtx.html