当前位置:   article > 正文

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

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


前言

最近在读刘丹冰大佬写的《深入理解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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/384208
推荐阅读
相关标签
  

闽ICP备14008679号