一.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的“+”