Go垃圾回收系列(一):标记清除算法

我爱学习 / 169 /

ChatGPT 可用网址,仅供交流学习使用,如对您有所帮助,请收藏并推荐给需要的朋友。
https://ckai.xyz

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

Golang在GC的演进过程中也经历了很多次变革

  • Go1.3 之前采用普通的标记-清除算法
  • Go1.5 引入了三色标记法和屏障技术
  • Go1.8 引入混合写屏障技术

本篇我们就按照时间线,从最开始的标记清除算法开始。

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

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

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

具体步骤

第一步,暂停程序业务逻辑, 分类出可达和不可达的对象,然后做上标记。

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

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

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

STW(stop the world)

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

标记清除法的缺点

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

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

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

如何解决?(三色标记法)


Go垃圾回收系列(一):标记清除算法
作者
我爱学习
许可协议
CC BY 4.0
发布于
2023-08-27
修改于
2024-12-22
Bonnie image
尚未登录