深入理解GO语言之GC垃圾回收

news/2024/5/14 13:58:06

文章目录

  • 前言
  • 一、Go V1.3之前的标记-清除(mark and sweep)算法
  • 二 、标记-清除(mark and sweep)的缺点
  • 总结


前言

最近在读刘丹冰大佬写的《深入理解Go语言》一书,在书中看了GC全场景分析,关于以下知识总结,进行分享

垃圾回收(Garbage Collection,简称GC)是编程语言中提供的自动的内存管理机制,自动释放不需要的内存对象,让出存储器资源。GC过程中无需程序员手动执行。GC机制在现代很多编程语言都支持,GC能力的性能与优劣也是不同语言之间对比度指标之一。


Golang在GC的演进过程中也经历了很多次变革,Go 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)算法

接下来我们来看一下在Golang1.3之前的时候主要用的普通的标记-清除算法,此算法主要有两个主要的步骤:

  • 标记(Mark phase)
  • 清除(Sweep phase)

1 标记清除算法的具体步骤
第一步,暂停程序业务逻辑, 分类出可达和不可达的对象,然后做上标记。

在这里插入图片描述
图中表示是程序与对象的可达关系,目前程序的可达对象有对象1-2-3,对象4-7等五个对象。

第二步, 开始标记,程序找出它所有可达的对象,并做上标记。如下图所示:

在这里插入图片描述
所以对象1-2-3、对象4-7等五个对象被做上标记。

第三步, 标记完了之后,然后开始清除未标记的对象. 结果如下。

在这里插入图片描述
操作非常简单,但是有一点需要额外注意:mark and sweep算法在执行的时候,需要程序暂停!即 STW(stop the world),STW的过程中,CPU不执行用户代码,全部用于垃圾回收,这个过程的影响很大,所以STW也是一些回收机制最大的难题和希望优化的点。所以在执行第三步的这段时间,程序会暂定停止任何工作,卡在那等待回收执行完毕。

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

以上便是标记-清除(mark and sweep)回收的算法。

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

标记清除算法明了,过程鲜明干脆,但是也有非常严重的问题。

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

Go V1.3版本之前就是以上来实施的, 在执行GC的基本流程就是首先启动STW暂停,然后执行标记,再执行数据回收,最后停止STW,如图所示。

在这里插入图片描述
从上图来看,全部的GC时间都是包裹在STW范围之内的,这样貌似程序暂停的时间过长,影响程序的运行性能。所以Go V1.3 做了简单的优化,将STW的步骤提前, 减少STW暂停的时间范围。如下所示

在这里插入图片描述
上图主要是将STW的步骤提前了一步,因为在Sweep清除的时候,可以不需要STW停止,因为这些对象已经是不可达对象了,不会出现回收写冲突等问题。

但是无论怎么优化,Go V1.3都面临这个一个重要问题,就是mark-and-sweep 算法会暂停整个程序 。

Go是如何面对并这个问题的呢?接下来G V1.5版本 就用三色并发标记法来优化这个问题.


总结

今天关于GC垃圾回收的知识先总结到这里,明天continue

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.tangninghui.cn.cn/item-12793.htm

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

CLIPSeg如果报“目标计算机积极拒绝,无法连接。”怎么办?

CLIPSeg这个插件在使用的时候,偶尔会遇到以下报错: Error occurred when executing CLIPSeg: (MaxRetryError("HTTPSConnectionPool(hosthuggingface.co, port443): Max retries exceeded with url: /CIDAS/clipseg-rd64-refined/resolve/main/toke…

vue3中播放flv流视频,以及组件封装超全

实现以上功能的播放&#xff0c;只需要传入一个流的地址即可&#xff0c;当然组件也只有简单的实时播放功能 下面直接上组件 里面的flvjs通过npm i flv.js直接下载 <template><div class"player" style"position: relative;"><p style&…

vue +elementui 导入CSV文件

目录 1. 安装依赖 2. 封装一个公共js方法&#xff0c;使用papaparse解析CSV文件且返回数组格式 3. html页面 4. 案例图 1. 安装依赖 cnpm i papaparse -s cnpm i jschardet -s 2. 封装一个公共js方法&#xff0c;使用papaparse解析CSV文件且返回数组格式 import jscharde…

2024-04-07 作业

作业要求&#xff1a; 1> 思维导图 2> 自由发挥应用场景实现一个登录窗口界面。 【可以是QQ登录界面、也可以是自己发挥的登录界面】 要求&#xff1a;尽量每行代码都有注释 作业1&#xff1a; 作业2&#xff1a; 运行代码&#xff1a; #include "myqwidget.h&quo…

Linux网络编程二(TCP图解三次握手及四次挥手、TCP滑动窗口、MSS、TCP状态转换、多进程/多线程服务器实现)

文章目录 1、TCP三次握手(1) 第一次握手(2) 第二次握手(3) 第三次握手 2、TCP四次挥手(1) 一次挥手(2) 二次挥手(3) 三次挥手(4) 四次挥手 3、TCP滑动窗口4、TCP状态时序图5、多进程并发服务器6、多线程并发服务器 1、TCP三次握手 TCP三次握手(TCP three-way handshake)是TCP协…

Go语言中channel和互斥锁的应用场景

面对一个并发问题,我们的解决方案是使用channel还是互斥锁来实现并不总是很清晰。因为Go提倡使用通信来共享内存,所以一个常见的错误就是总是强制使用channel,不管实际情况如何。但是我们应该把这两种选择作为互补手段。 首先,简单回顾一下Go语言中的channel:channel是一种交…