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