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