请列举常见的垃圾回收(GC)实现方式,并说明 Go 语言采用的是哪种 GC 机制?
考察说明
考查对常见 GC 算法和 Go 语言 GC 实现的了解程度。
回答思路
- 【回答框架 1】常见的 GC 实现方式包括引用计数、标记-清除、标记-复制、标记-整理(压缩)以及分代收集等。引用计数通过维护对象引用数,归零时回收,但难以处理循环引用;标记-清除通过从根集合扫描,标记可达对象,再清除未标记对象,能处理循环引用但会产生内存碎片;标记-复制将内存分为两部分,只复制存活对象,适合存活率低的场景;标记-整理在标记后移动存活对象,减少碎片,但移动代价高。分代收集基于弱分代假说,将对象按年龄分代,对年轻代频繁回收,提升效率。
- 【回答框架 2】Go 语言采用的 GC 是基于标记-清除的改进算法,并且是并发三色标记清除。Go 的 GC 使用三色抽象(白、灰、黑)来追踪对象状态,通过写屏障和辅助 GC 机制实现并发标记,减少 STW(Stop-The-World)时间。Go 2.x 版本还引入了混合写屏障,进一步缩短 STW。整个 GC 过程包括标记准备、标记、标记终止、清除以及清除终止等阶段,其中标记阶段是并发执行的,清除阶段也是并发进行的。
- 【关键点 1】Go GC 是并发三色标记清除算法,优化了 STW 时间。
- 【关键点 2】Go GC 使用写屏障技术来实现并发标记,减少应用暂停。
- 【关键点 3】Go GC 不是分代 GC,而是非分代、非移动的标记清除。
- 【易错点 1】不要将 Go GC 误认为是分代收集;Go 是非分代、非移动的。
- 【易错点 2】不要认为 Go GC 完全无 STW;Go 仍有短暂的 STW,但已大幅缩短。
- 【易错点 3】不要混淆标记-复制与 Go GC;Go 不使用复制收集。