首先来看第一个问题 Go语言有什么特点?
- 高性能,高并发
- 语法简单,学习曲线平缓
- 内置丰富的一个标准库
- 具有完善的工具链
- 默认静态链接
- 快速编译
- 跨平台
- 具有三色标记法垃圾回收机制
说到垃圾回收机制,我们都知道其他语言例如Java,Python,Swift都具有垃圾回收机制,那么Golang的三色标记法是如何去实现垃圾回收的呢?
目前比较常见的垃圾回收算法有三种:
-
引用计数:为每个对象维护一个引用计数,当引用该对象的对象销毁时,引用计数 -1,当对象引用计数为 0 时回收该对象。
- 代表语言:Python
- 优点:对象回收快,不会出现内存耗尽或达到某个阈值时才回收。
- 缺点:不能很好的处理循环引用,而实时维护引用计数也是有损耗的。
-
标记-清除:从根变量开始遍历所有引用的对象,标记引用的对象,没有被标记的进行回收。
- 代表语言:Golang(三色标记法)
- 优点:解决了引用计数的缺点。
- 缺点:需要 STW,暂时停掉程序运行。
-
分代收集:按照对象生命周期长短划分不同的代空间,生命周期长的放入老年代,短的放入新生代,不同代有不同的回收算法和回收频率。
- 代表语言:Java
- 优点:回收性能好
- 缺点:算法复杂
其实三色标记法只是为了叙述方便而抽象出来的一种说法,实际上的对象是没有三色之分的。这里的三色分别为黑色,白色,灰色,对应了垃圾回收过程中对象的三种状态