Golang 使用哪种垃圾收集机制?

Go语言使用的垃圾收集器为:标记-清除(mark-and-sweep)垃圾收集器。

它的工作原理为:

  1. 标记阶段:
    首先会将所有还在使用的变量进行标记,这需要追踪程序的控制流。
  2. 清除阶段:
    然后会释放所有未标记的变量,回收它们占用的内存空间。
    这个过程主要分为以下几步:
    1) 根集初始化:包括全局变量在内的根引用作为起始点。
    2) 跟踪作用域: 递归访问所有指向根集的可达引用。
    3) 对象标记: 将所有可达的对象进行标记。
    4) 清除未标记对象: 释放所有未标记对象的内存。
    5) 空间整理: 重新分配内存空间。

优点:

  1. 内存回收准确
  2. 简单易实现

缺点:

  1. 停顿时间长
  2. 空间利用率低

Go还采用了逃逸分析等方法来提高垃圾收集效率。

总的来说,Go采用标记-清除垃圾收集器的原因主要有:

  1. 简单易实现
  2. 可遍历所有对象进行标记
  3. 内存回收准确

但它的收集周期长导致停顿明显。