提升Quarkus原生性能:应该坚持使用空间/时间还是切换到自适应GC?

Quarkus 默认垃圾回收策略的变更

Quarkus,作为 Kubernetes 原生的 Java 框架,在 2.13.6.Final 版本中,将原生运行时的默认垃圾回收(GC)策略从 space/time 切换为 adaptive GC。这一变更旨在解决某些情况下 space/time 策略对内存消耗和性能的影响。

Adaptive GC 的优势

Adaptive GC 的设计目标是通过积极触发 GC 来降低内存消耗。这种策略在需要低内存占用的场景中表现更为有效,尤其是在高负载情况下,其性能似乎更优。Adaptive GC 是 GraalVM CE 的默认 GC 策略,基于 HotSpot 的 ParallelGC 自适应大小策略,但更加注重内存占用。它会跟踪连续次要集合中的暂停时间,并在超过阈值时安排一次完整的 GC,从而更有效地缓解潜在的 GC 问题。

Space/Time 策略的局限性

尽管 space/time 策略在平衡年轻代和完整 GC 方面通常表现良好,但在物理内存超过 3GB 且未配置最大堆大小(-Xmx)时,可能会导致异常的内存消耗。此外,由于 space/time 策略中缺少幸存区空间,年轻对象可能会迅速积累到老年代,直到触发完整 GC,从而导致内存消耗的潜在峰值。

两种策略的潜在风险

  • Space/Time 策略需要通过非公开 API(-H:)进行设置,这可能在未来难以持续支持。
  • Adaptive GC 可能减少完整 GC 事件的触发,而这正是 space/time 策略的主要特点之一。此外,串行 GC 的老年代可能会从复制模式切换到标记-清除-压缩模式,这需要进一步评估完整 GC 的成本。

选择合适 GC 策略的重要性

Quarkus 考虑切换到 adaptive GC 策略,突显了根据具体场景选择合适 GC 策略的重要性。开发者需要考虑物理内存、工作负载压力水平以及低内存占用的需求等因素。深入了解 GC 策略 可以帮助开发者优化应用性能并最小化内存消耗。

开发者资源

对于希望深入了解 Quarkus 原生内存使用情况的开发者,可以参考原始的 GitHub Issue。此外,Quarkus 还在其参考指南中添加了一个名为 "Native Memory Management" 的新章节,帮助开发者优化应用程序的内存使用。通过利用这些资源,开发者可以更好地理解应用程序的内存使用情况,并做出更明智的决策以提高性能。

阅读 24
0 条评论