golang Gc
简易概括说明:
标记清除
当程序的内存占用达到一定阈值时,整个应用程序就会全部暂停,垃圾收集器会扫描已经分配的所有对象并回收不再使用的内存空间
1.标记阶段 — 从根对象出发查找并标记堆中所有存活的对象;
2..清除阶段 — 遍历堆中的全部对象,回收未被标记的垃圾对象并将回收的内存加入空闲链表;
Go V1.5的三色并发标记法:
颜色分为白黑灰
白色对象:潜在的垃圾
灰色对象 : 成为黑色的路上
黑色对象 :从跟节点能够到达的对象
所有对象刚开始创建都为白色
由每轮进行调整
从根节点进行扫描 扫描到的对象会从白到灰在调整为黑色
下一轮 黑色的下一个对象则会变为灰色
下一轮 灰色就会变成黑色 。。。。。。 以此类推
最后没有了灰色 再清空白色对象
这样会造成问题:
1.如果中间突然有一个白色被黑色引用
白色是会被清理的,由于突然引用,则会出现悬挂指针,找不到对应对象
2.灰色和下一个白色对象之间的关联被干掉.
这个就是导致后面全成了白色,全部会被干掉,但他们其实是有引用关系的,
不能被干掉
所以就出现了 屏障机制:
插入屏障
具体操作:在A对象引用B对象的时候,B对象被标记为灰色
缺点:结束时需要STW来重新扫描对象,标记上那些引用的白色对象
因为有些白色对象还是会被黑色引用,比如刚刚新创建的对象,需要stw停止进行调整.
删除屏障
具体操作:被删除的对象,如果自身为灰色或者白色,那么被标记为灰色。
缺点:回收精度低,会变成了所有删除对象都成为黑色,其实并不是这样,有些
是可以被回收的,并没有在根节点可达对象的队列当中.
所以gov1.8 推出了 混合写屏障
Go V1.8的混合写屏障(hybrid write barrier)机制
1、GC开始将栈上的可达对象全部扫描并标记为黑色(之后不再进行第二次重复扫描,无需STW),
2、GC期间,任何在栈上创建的新对象,均为黑色。
3、被删除的对象标记为灰色。
4、被添加的对象标记为灰色。