【Golang】三色标记、混合写屏障GC模式图文全分析

本文深入解析Golang的垃圾回收机制,从早期的标记-清除算法到V1.5的三色并发标记法,再到V1.8的混合写屏障机制。介绍了STW、屏障机制及其优化,旨在理解Golang GC的原理和进化过程。
摘要由CSDN通过智能技术生成

如果您觉得有帮助,麻烦点个赞或者关注支持一下,定期推送文章

Golang 三色标记、混合写屏障GC模式图文全分析

垃圾回收(Garbage Collection,简称GC)是编程语言中提供的自动的内存管理机制,自动释放不需要的对象,让出存储器资源,无需程序员手动执行。

Golang中的垃圾回收主要应用三色标记法,GC过程和其他用户goroutine可并发运行,但需要一定时间的STW(stop the world),STW的过程中,CPU不执行用户代码,全部用于垃圾回收,这个过程的影响很大,Golang进行了多次的迭代优化来解决这个问题,本文将逐步推进Golang中GC的每次推进,来理解Gc的原理。

零、内容提纲

本文将系统的详细介绍Golang中GC的全分析过程,包括垃圾回收的方式递进。

内容概要:

  • G0 V1.3之前的标记-清除(mark and sweep)算法
  • Go V1.3之前的标记-清除(mark and sweep)的缺点
  • Go V1.5的三色并发标记法
  • Go V1.5的三色标记为什么需要STW
  • Go V1.5的三色标记为什么需要屏障机制(“强-弱” 三色不变式、插入屏障、删除屏障 )
  • Go V1.8混合写屏障机制
  • Go V1.8混合写屏障机制的全场景分析

一、Go V1.3 之前的标记-清除(mark and sweep)算法

此算法主要有两个主要的步骤:

  • 标记(Mark phase)
  • 清除(Sweep phase)
  1. 暂停程序业务逻辑, 找出不可达的对象,然后做上标记。
    操作非常简单,但是有一点需要额外注意:mark and sweep算法在执行的时候,需要程序暂停!即 STW(stop the world)。也就是说,这段时间程序会卡在哪儿。
    【Golang】三色标记、混合写屏障GC模式图文全分析
  2. 开始标记,程序找出它所有可达的对象,并做上标记。如下图所示:
    【Golang】三色标记、混合写屏障GC模式图文全分析
  3. 标记完了之后,然后开始清除未标记的对象. 结果如下
    【Golang】三色标记、混合写屏障GC模式图文全分析
  4. 停止暂停,让程序继续跑。然后循环重复这个过程,直到process程序生命周期结束。

二、标记-清除(mark and sweep)的缺点

  • STW,stop the world;让程序暂停,程序出现卡顿 (重要问题)。
  • 标记需要扫描整个heap
  • 清除数据会产生heap碎片

所以Go V1.3版本之前就是以上来实施的, 流程是
【Golang】三色标记、混合写屏障GC模式图文全分析
Go V1.3 做了简单的优化,将STW提前, 减少STW暂停的时间范围.如下所示
【Golang】三色标记、混合写屏障GC模式图文全分析
这里面最重要的问题就是:mark-and-sweep 算法会暂停整个程序 。
Go是如何面对并这个问题的呢?接下来G V1.5版本 就用三色并发标记法来优化这个问题.

三、Go V1.5的三色并发标记法

三色标记法 实际上就是通过三个阶段的标记来确定清楚的对象都有哪些. 我们来看一下具体的过程.

第一步 , 就是只要是新创建的对象,默认的颜色都是标记为“白色”.
【Golang】三色标记、混合写屏障GC模式图文全分析
这里面需要注意的是, 所谓“程序”, 则是一些对象的跟节点集合.
【Golang】三色标记、混合写屏障GC模式图文全分析
所以上图,可以转换如下的方式来表示.

第二步, 每次GC回收开始, 然后从根节点开始遍历所有对象,把遍历到的对象从白色集合放入“灰色”集合。

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值