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" 的新章节,帮助开发者优化应用程序的内存使用。通过利用这些资源,开发者可以更好地理解应用程序的内存使用情况,并做出更明智的决策以提高性能。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。