Go语言与C/C++语言一个显著不同是Go中对象内存空间的回收是通过GC机制来完成的,不需要C++一样通过程序员的手动申请和释放。

1. 变革

  • Go V1.3 标记-清除(mark and sweep)法
  • Go V1.5 的三色并发标记法
  • Go V1.5 的强三色不变式、弱三色不变式、插入屏障、删除屏障
  • Go V1.8 的混合写屏障机制

2. 标记-清除法的缺点

  • STW的过程,需暂停程序
  • 标记需要扫描整个堆
  • 清除数据会产生heap碎片

3.三色并发标记法

  • 三色指的是白色 - 灰色 - 黑色,灰色作为中间过渡,标记为白色的对象最终被回收,标记为黑色的对象程序均可达
  • 强三色不变式、弱三色不变式、插入屏障、删除屏障均是对三色并发标记法的改进

4. 混合写屏障机制

  • 由三色标记+写屏障+GC辅助组合而成
  • 写屏障:
    含义:在每一轮GC开始时会初始化一个叫做“屏障”的东西,然后由它记录第一次scan时各个对象的状态,以便和第二次re-scan进行对比,引用状态变化的对象被标记为灰色以防止丢失,将屏障前后状态未变化对象继续处理
    引入原因:mark过程与用户程序是并行的,防止mark过程中出现新的对象分配和指针赋值,被丢失,这些会通过写屏障记录下来,由re-scan找到
  • 辅助GC:
    用户分配内存速度大于内存回收速度的场景,这个时候用户程序会被暂停,加入到垃圾回收来提高GC速度,防止扫描和回收没完没了停不下来,因为新分配对象比回收块,所以这种东西叫辅助回收

5.GC触发条件两个

  • 超过内存大小阈值
  • 达到内存回收定时时间

6. GC调优

  • 减少对象的分配,合理重复利用
  • 少量使用+连接string