Go语言使用的垃圾收集器为:标记-清除(mark-and-sweep)垃圾收集器。
它的工作原理为:
- 标记阶段:
首先会将所有还在使用的变量进行标记,这需要追踪程序的控制流。 - 清除阶段:
然后会释放所有未标记的变量,回收它们占用的内存空间。
这个过程主要分为以下几步:
1) 根集初始化:包括全局变量在内的根引用作为起始点。
2) 跟踪作用域: 递归访问所有指向根集的可达引用。
3) 对象标记: 将所有可达的对象进行标记。
4) 清除未标记对象: 释放所有未标记对象的内存。
5) 空间整理: 重新分配内存空间。
优点:
- 内存回收准确
- 简单易实现
缺点:
- 停顿时间长
- 空间利用率低
Go还采用了逃逸分析等方法来提高垃圾收集效率。
总的来说,Go采用标记-清除垃圾收集器的原因主要有:
- 简单易实现
- 可遍历所有对象进行标记
- 内存回收准确
但它的收集周期长导致停顿明显。