图解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
投稿

猜你喜欢

  • 对Golang中的runtime.Caller使用说明

    2024-05-21 10:24:43
  • django rest framework之请求与响应(详解)

    2022-09-11 00:30:03
  • 数据库安全应用 使用MySQL的23个注意事项

    2009-05-13 10:27:00
  • Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题

    2022-03-27 17:21:42
  • Python学习笔记之Zip和Enumerate用法实例分析

    2021-09-03 19:58:50
  • wxpython自定义下拉列表框过程图解

    2023-11-14 04:01:18
  • 如何在Python中妥善使用进度条详解

    2022-05-30 12:10:05
  • Python之Pygame的Draw绘图

    2022-11-29 18:51:18
  • 利用python如何实现猫捉老鼠小游戏

    2023-12-08 06:20:34
  • Windows环境下python环境安装使用图文教程

    2023-12-25 10:13:26
  • golang逐行读取文件的操作

    2023-07-10 14:39:56
  • ASP设计常见问题及解答精要

    2009-04-21 11:16:00
  • Python def函数的定义、使用及参数传递实现代码

    2023-02-23 04:54:34
  • Python进阶之全面解读高级特性之切片

    2023-08-06 21:28:00
  • Oracle10g 安装方法

    2009-06-19 17:50:00
  • Python 十个字典用法使用技巧归纳

    2023-10-14 16:52:54
  • AjaxUpLoad.js实现文件上传

    2024-05-11 09:42:07
  • 关于使用PLSQL Developer时出现报错ora-12514的问题

    2024-01-15 09:12:17
  • Python 文件处理注意事项总结

    2022-05-20 23:05:17
  • python第三方库visdom的使用入门教程

    2021-12-08 22:32:51
  • asp之家 网络编程 m.aspxhome.com