设为首页 收藏本站
查看: 1251|回复: 0

[经验分享] golang的垃圾回收(GC)机制

[复制链接]

尚未签到

发表于 2018-9-20 13:20:04 | 显示全部楼层 |阅读模式
golang的垃圾回收采用的是 标记-清理(Mark-and-Sweep) 算法

就是先标记出需要回收的内存对象快,然后在清理掉;

在这里不介绍标记和清理的具体策略(可以参考https://lengzzz.com/note/gc-in-golang),只介绍 GC过程是怎么调度的以及stw相关

这个算法,会导致 stw (stop the world)的问题,中断用户逻辑

触发GC机制

1.    在申请内存的时候,检查当前当前已分配的内存是否大于上次GC后的内存的2倍,若是则触发(主GC线程为当前M)

2.    监控线程发现上次GC的时间已经超过两分钟了,触发;将一个G任务放到全局G队列中去。(主GC线程为执行这个G任务的M)


每当触发的时候,在主GC线程中就会走如下的GC流程:

1.    stop the world,等待所有的M休眠;此时所有的业务逻辑代码都停止

2.    标记:分配gc标记任务,唤醒 gcproc个 M(就是第一步休眠的那些),分别做这个,直到所有的M都做完,才结束;并且所有M再次进入休眠

3.    清理:有一个单独的goroutine去清理已经标记的内存对象快

4.    start the world,设置gcwaiting=0,唤醒所有的M(不会超过P个数)


对于上面的三个步骤,分别解释:

stop the world:

1.    设置gcwaiting=1,这个在每一个G任务之前会检查一次这个状态,如是,则会将当前M休眠;

2.    如果这个M里面正在运行一个长时间的G任务,咋办呢,难道会等待这个G任务自己切换吗?这样的话可要等10ms啊,不能等!坚决不能等!

  所以会主动发出抢占标记(类似于上一篇),让当前G任务中断,再运行下一个G任务的时候,就会走到第1步
3.    一直等待所有的M进入休眠,此时所有的业务逻辑代码都停止

标记:

1.     根据gcproc的个数,分配成gcproc任务段;唤醒gcproc-1个M来执行(当前M也算一个)

2.    对于一个M,唤醒前设置它的helpgc标记,唤醒之后这个M会立马判断这个标记,如是,则开始做分配给自己的标记任务,如果先做完了,就会从别的M里面找一些来做

3.    等每一个M都做完,会再次进入休眠

清理:

1.    通过设置参数,可以以一个单独goroutine  运行,这个功能是在1.3版本之后增加的,这样的话就直接到下一步了,清理过程不是stw的

2.    也可以串行的在主GC线程执行;这样的话则清理过程也是stw的,

start the world:

1.    设置gcwaiting=0

2.    唤醒P个M来继续做G任务(此时没有helpgc标记),业务逻辑代码开始



综上:

是基于1.4版本的,GC过程在标记过程是(STW)的

在1.5版本里面对GC做了很大的优化;采用三色标记,将标记过程细化成三段,只有前后的两段是stw的;极大地缩短了gc的stw时间

DSC0000.jpg



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-598911-1-1.html 上篇帖子: 微信消息加解密(GoLang) 下篇帖子: 从源码(编译)安装golang 二
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表