图解Golang的GC垃圾回收算法

作者:RyuGou 时间:2023-07-12 23:25:45 

虽然Golang的GC自打一开始,就被人所诟病,但是经过这么多年的发展,Golang的GC已经改善了非常多,变得非常优秀了。

以下是Golang GC算法的里程碑:

  • v1.1 STW

  • v1.3 Mark STW, Sweep 并行

  • v1.5 三色标记法

  • v1.8 hybrid write barrier

经典的GC算法有三种: 引用计数(reference counting)标记-清扫(mark & sweep)复制收集(Copy and Collection)

Golang的GC算法主要是基于 标记-清扫(mark and sweep) 算法,并在此基础上做了改进。因此,在此主要介绍一下 标记-清扫(mark and sweep)算法 ,关于 引用计数(reference counting)复制收集(copy and collection) 可自行百度。

标记-清扫(Mark And Sweep)算法

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

  • 标记(Mark phase)

  • 清除(Sweep phase)

第一步,找出不可达的对象,然后做上标记。

第二步,回收标记好的对象。

操作非常简单,但是有一点需要额外注意: mark and sweep 算法在执行的时候,需要程序暂停!即 stop the world

也就是说,这段时间程序会卡在哪儿。故中文翻译成 卡顿

我们来看一下图解:

开始标记,程序暂停。程序和对象的此时关系是这样的:

图解Golang的GC垃圾回收算法

然后开始标记,process找出它所有可达的对象,并做上标记。如下图所示:

图解Golang的GC垃圾回收算法

标记完了之后,然后开始清除未标记的对象:

图解Golang的GC垃圾回收算法

然后 垃圾 清除了,变成了下图这样。

图解Golang的GC垃圾回收算法

最后,停止暂停,让程序继续跑。然后循环重复这个过程,直到 process 生命周期结束。

标记-清扫(Mark And Sweep)算法存在什么问题?

标记-清扫(Mark And Sweep)算法 这种算法虽然非常的简单,但是还存在一些问题:

  • STW,stop the world;让程序暂停,程序出现卡顿。

  • 标记需要扫描整个heap

  • 清除数据会产生heap碎片

这里面最重要的问题就是:mark-and-sweep 算法会暂停整个整个程序。

Go是如何面对并这个问题的呢?

三色并发标记法

我们先来看看Golang的三色标记法的大体流程。

首先:程序创建的对象都标记为白色。

图解Golang的GC垃圾回收算法

gc开始:扫描所有可到达的对象,标记为灰色

图解Golang的GC垃圾回收算法

从灰色对象中找到其引用对象标记为灰色,把灰色对象本身标记为黑色

图解Golang的GC垃圾回收算法

监视对象中的内存修改,并持续上一步的操作,直到灰色标记的对象不存在

图解Golang的GC垃圾回收算法

此时,gc回收白色对象。

图解Golang的GC垃圾回收算法

最后,将所有黑色对象变为白色,并重复以上所有过程。

图解Golang的GC垃圾回收算法

来源:https://juejin.im/post/5c8525666fb9a049ea39c3e6

标签:Golang,GC,垃圾回收
0
投稿

猜你喜欢

  • 5个css布局的常见问题及解决方法

    2009-11-19 13:21:00
  • Oracle性能究极优化

    2010-07-30 13:02:00
  • SQL基础语句总结

    2011-03-11 14:54:00
  • asp+xml自动将远程页面中的图片下载到本地

    2007-08-23 13:34:00
  • 服务器XMLHTTP(Server XMLHTTP in ASP)基础知识

    2011-03-06 11:11:00
  • MySQL内建复制功能来优化可用性

    2010-10-25 20:20:00
  • 教程javascript的function(函数)

    2007-09-30 13:38:00
  • 关于MySQL中隐藏空间的问题

    2009-07-30 08:15:00
  • 微信小程序(微信应用号)开发工具0.9版安装详细教程

    2023-06-12 23:33:37
  • 用"表情符号"做植入广告 是否可行呢?

    2009-02-23 13:07:00
  • 对架构师的建议:博学笃志,切问近思

    2009-09-25 12:55:00
  • 解决Dreamweaver不支持中文文件名

    2008-06-04 09:37:00
  • 实例讲解启动mysql server失败的解决方法

    2008-12-26 17:27:00
  • ASP.Net MVC 布局页、模板页使用方法详细介绍

    2023-06-28 19:24:31
  • asp中如何过滤到单引号

    2009-07-05 18:38:00
  • ACCESS数据库遇日文时内存溢出的最简单处理办法

    2009-07-09 14:04:00
  • Dreamweaver制作网页实用七小招

    2009-05-29 18:36:00
  • 8个asp生成随机字符的函数

    2007-08-04 10:17:00
  • Web2.0视觉风格进化论 之一

    2007-11-03 19:58:00
  • 将HTML自动转为JS代码

    2010-03-17 20:49:00
  • asp之家 网络编程 m.aspxhome.com