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 算法会暂停整个程序 。
如何解决?(三色标记法)