go语言中的垃圾回收机制(gc)

go语言中的垃圾回收机制(gc)

引用计数法

适用于内存占用小于32kb时使用

在每个对象内部维护一个整数值,叫做这个对象的引用计数,当对象被引用时引用计数加一,当对象不被引用(释放、置nil)时引用计数减一。当引用计数为 0 时,自动销毁对象。另外的缺陷是,每次对象的赋值都要将引用计数加一,增加了消耗。

Mark-Sweep法(标记清除法)(go早期使用)

这个算法分为两步,标记和清除。
标记:从程序的根节点开始, 递归地 遍历所有对象,将能遍历到的对象打上标记。
清除:讲所有未标记的的对象当作垃圾销毁。

三色标记法(go后来使用)

适用于内存占用大于32kb时使用

三色标记法是传统 Mark-Sweep 的一个改进,它是一个并发的 GC 算法。

原理:

1、首先创建三个集合:白、灰、黑。
2、将所有对象放入白色集合中。
3、然后从根节点开始遍历所有对象(注意这里并不递归遍历),把遍历到的对象从白色集合放入灰色集合。
4、之后遍历灰色集合,将灰色对象引用的对象从白色集合放入灰色集合,之后将此灰色对象放入黑色集合
5、重复 4 直到灰色中无任何对象
6、通过write-barrier检测对象有变化,重复以上操作
7、收集所有白色对象(垃圾)

注意:

  • write-barrier:gc运行的过程中,可以监控内存中对象的修改,并对对象进行重新标记
  • 对象颜色代表的意义
    • 白色:待清理对象
    • 灰色:标记的中间状态
    • 黑色:活跃对象,其引用对象都是灰色或黑色
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值