一.GC

  • GC英文全称 garbage collector

  • Go语言GC是相对C/C++语言非常重要的改进。

  • 一些常用的GC算法。

    • 引用计算法:当对象被引用时计算器+1,不被引用时-1

      • PHP和Object-C使用。
      • 相互引用无法回收。
      • 计数增加消耗。
    • Mark And Sweep 标记和清除算法。停止程序运行,递归遍历对象,进行标记,标记完成后将所有没有引用的对象清除。

      • 由于标记需要停止程序(Stop th world),当对象特别多是,标记和清除过程比较耗时(可能几百毫秒),很难受。
    • 三色标记法:

      是Mark And Sweep的改进版,从逻辑上分为白色区(未搜索),灰色区(正搜索),黑色区(已搜索)。

      灰色区内容是子引用没有进行搜索,黑色区表示子引用存在。

    • 分代收集,一般情况下有三代,例如java中新生代,老年代,永久代,当新生代中带有阈值时会把对象放到老年代,相同道理老年代内容达到阈值会放到永久代。

二.GO语言中的GC

  • Go语言中采用Stop The world 方式。
  • GoLang每个版本基本上都会有对Gc进行优化,从golang 1.5开始支持并发(concurrent)收集,从1.8版本已经吧STW时间优化到了100微妙,通常只需要10微妙以下,且在1.10版本时再次优化减少GC对CPU占用。
  • Go语言中GC是自动运行的,在下情况不会触发GC。
    • 当需要申请内存时,发现GC是上次GC两倍时会触发。
    • 每2分钟自动运行一次GC。
  • GC调优
    • 小对象复用,局部变量尽量少声明,多个小对象可以放到结构体,方便GC扫描。
    • 少用String的“+”