在上一篇文章中介绍的 MS 优化策略都是围绕 sweep 阶段展开,但 mark 阶段会导致应用程序挂起,也就是常说的:stop-the-world(STW),这严重影响了 Tracing GC 的应用场景。本文即将介绍的增量式 GC 可以大大缓解 STW 问题。
增量式思路
增量式(incremental)顾名思义,允许 mutator 与 collector 并行执行。 引用计数类 GC 本身就具有增量式特性,但由于其算法自身的缺陷与效率问题,一般不会采用。而追踪类 GC 实现增量式的难点在于:
在 collector 遍历引用关系图,mutator 可能会改变对象间的引用关系
这其实是一个并发问题,collector 线程与 mutator 线程同时去读/写一些共享的数据结构(引用关系图),这就要求把它保护起来,使 collecotr 与 mutator 能够感知其改变,并作出相应调整。 在 GC 期间,对 mutator 改变「引用关系图」的保守度(conservatism)是增量式 GC 大一特性。如果 mutator 在 collector 遍历某对象后将其释放(floating garbage),那么这个对象在本次 GC 不会被回收,但在下一轮 GC 开始时会被回收。 这种弱一致性(relaxed consistency)是允许的,因为它不会对程序逻辑造成影响,只是延迟了垃圾对象的回收,而且一致性越弱,遍历算法的实现就可以更灵活。
更多内容可点击https://liujiacai.net/blog/2018/08/04/incremental-gc/。