02.2跟雨痕看go源码- 并发清理与三色标记

本文探讨Go语言1.5版本的垃圾回收优化,特别是并发扫描和清理过程。通过gcinit()启动,gcBgMarkStartWorkers为每个处理器分配工作者进行并发标记。并发扫描分为三次,第一次通过parforsetup初始化,第二次和第三次进一步清理。并发清理通过gosweepone进行,main函数中的sysmon监控定期触发垃圾回收。parforsetup和parfordo用于并行任务分发和完成。
摘要由CSDN通过智能技术生成

据说这是go优化最狠的地方。
http://blog.csdn.net/erlib/article/details/51850912
大意是说twitch.tv觉得一次标记的STW(stop the world,就是jojo里面的技能,标记和回收时间很长,所有应用代码都无法工作)太强力了竟然需要2秒钟,不能忍,所以在和go开发团队多次沟通后,开始了大量的优化,这里的代码充斥着并发优化的痕迹。据说到了go1.7的时候STW仅剩下1毫秒。。。go1.5就已经达到了200ms(已经不错了哦)。
我们现在可以看一下go1.5所做的优化orz。大神好厉害。orz orz orz。

三色标记的基本逻辑:
- 起初所有对象都是白色。
- 扫描找出所有可达对象标记为灰色,翻入待处理队列。
- 从队列中提取灰色对象,将其引用的对象标记为灰色放入队列。自身标记为黑色。
- 写屏障件事所有对象内存修改,重新标色或放回队列。

1.初始化
在schedinit里面的gcinit()初始化
启动,在申请新内存时的函数newobject()的末尾就会检查一下,如果达到一定的量就触发。
最终调用gc函数启动。

首先先来看雨痕大大给的gc的标记清理的主流程:
这里写图片描述

这里的主要牛b的代码在并发扫描和并发清理:

2.并发扫描
第一次
gcBgM

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值