go Gc

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、被添加的对象标记为灰色。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值