Golang三色标记回收机制| 青训营笔记

93 阅读2分钟

首先来看第一个问题 Go语言有什么特点?

  1. 高性能,高并发
  2. 语法简单,学习曲线平缓
  3. 内置丰富的一个标准库
  4. 具有完善的工具链
  5. 默认静态链接
  6. 快速编译
  7. 跨平台
  8. 具有三色标记法垃圾回收机制

说到垃圾回收机制,我们都知道其他语言例如Java,Python,Swift都具有垃圾回收机制,那么Golang的三色标记法是如何去实现垃圾回收的呢?

目前比较常见的垃圾回收算法有三种:

  • 引用计数:为每个对象维护一个引用计数,当引用该对象的对象销毁时,引用计数 -1,当对象引用计数为 0 时回收该对象。

    • 代表语言:Python
    • 优点:对象回收快,不会出现内存耗尽或达到某个阈值时才回收。
    • 缺点:不能很好的处理循环引用,而实时维护引用计数也是有损耗的。
  • 标记-清除:从根变量开始遍历所有引用的对象,标记引用的对象,没有被标记的进行回收。

    • 代表语言:Golang(三色标记法)
    • 优点:解决了引用计数的缺点。
    • 缺点:需要 STW,暂时停掉程序运行。
  • 分代收集:按照对象生命周期长短划分不同的代空间,生命周期长的放入老年代,短的放入新生代,不同代有不同的回收算法和回收频率。

    • 代表语言:Java
    • 优点:回收性能好
    • 缺点:算法复杂

其实三色标记法只是为了叙述方便而抽象出来的一种说法,实际上的对象是没有三色之分的。这里的三色分别为黑色,白色,灰色,对应了垃圾回收过程中对象的三种状态