Shenandoah GC与G1GC部分特性对比

75 阅读2分钟

在 Java 21 中引入了 Shenandoah GC 的优化版本 ——Shenandoah GC Uncommit。

Shenandoah GC 是一种低停顿时间的垃圾收集器,旨在减少垃圾收集暂停时间,特别适用于对响应时间要求较高的应用程序。

Shenandoah GC 的主要目标之一是实现非常低的停顿时间,甚至在一些情况下可以将停顿时间降低到几乎为零。这对于需要实时响应的应用程序非常重要,例如金融交易系统、在线游戏等。

Shenandoah GC 采用并发回收的方式,在垃圾收集过程中,大部分操作可以与应用程序线程同时执行。这意味着垃圾收集不会导致长时间的应用程序停顿,从而提高了系统的响应性。

G1GC 也采用了部分并发回收的方式。

在 G1GC 中:

  • 初始标记阶段:伴随一次新生代的 Minor GC,这个阶段会短暂暂停应用程序线程,标记从根节点直接可达的老年代对象,但暂停时间通常很短。
  • 并发标记阶段:与应用程序线程并发执行,遍历整个堆内存,标记所有可达的对象。
  • 最终标记阶段:会短暂暂停应用程序线程,处理在并发标记阶段中由于应用程序线程的修改而导致的对象状态变化。
  • 筛选回收阶段:可以与应用程序线程同时执行一部分操作,但在某些时候也需要暂停应用程序线程来完成一些关键的清理和整理工作。
  • G1GC
    • 目标是在尽可能短的停顿时间内完成垃圾回收,同时在整体上实现较高的吞吐量。
    • 适用于需要相对较短的垃圾回收停顿时间,同时对吞吐量也有一定要求的应用场景,如大型企业级应用等。
  • Shenandoah GC
    • 主要目标是实现极低的停顿时间,甚至可以达到几乎无停顿的垃圾回收。
    • 特别适用于对响应时间要求极高的实时系统、金融交易等场景。