Golang入门——GC机制
常见GC算法
引用计数
每个对象维护一个计数器,当引用该对象的对象被销毁时,计数器减一,当计数器为0时回收该对象。
代表语言:Python,PHP,Swift
优点:对象可以很快被回收,不会出现内存耗尽再回收的现象。
缺点:不能很好的处理循环引用,而且维护计数器需要开销。
标记清除
从根变量开始便利所有引用对象,当引用对象没有标记“被引用”,则回收该对象。
代表语言:GO(三色标记法)
优点:解决引用计数的缺点。
缺点:需要STW,暂时停止程序运行。
分代收集
按照对象的证明周期长短划分不同代空间,生命周期长的放入老年代,生命周期短的放入新生代,不同代有不用的回收算法以及回收频率。
代表语言:Java
优点:回收性能好。
缺点:算法复杂。
Go的GC
mark内存标记
在span的数据结构中维护位图allocBits表示内存块分配情况,同时还维护另一个位图gcmarkBits记录每块内存的标记情况。由于allocBits与gcmarkBits数据结构相同,回收时将allocBits指向gcmarkBits,表示只有标记过的内存才是存活的。gcmarkBits会在下次标记时重新分配内存。
三色标记法
灰色:对象还在标记队列中等