Kubernetes 原生 Java 框架Quarkus在版本2.13.6.Final中将其默认的垃圾回收 (GC) 策略从空间/时间切换为适用于原生运行时的自适应 GC。自适应 GC 旨在主动触发 GC,以保持较低的内存消耗。这使得它在低内存占用很重要的情况下更加有效,并且它似乎在重压下表现更好。 这是为了回应在某些情况下空间/时间策略对内存消耗和性能影响的担忧。虽然空间/时间通常可以有效地平衡年轻和完整的 GC,并且目前是 Quarkus 的默认设置,但当物理内存超过 3 GB 且没有最大堆大小时,它可能会导致奇怪的内存消耗(-Xmx) 被配置。
Adaptive GC 是 GraalVM CE 对于串行 GC 的默认GC 策略。它基于 HotSpot 的 ParallelGC 自适应大小策略,但更注重内存占用。这意味着,与空间/时间不同,它会主动触发 GC 以降低内存消耗。自适应 GC 跟踪连续次要收集中的暂停时间,并在超过阈值时安排完整 GC,从而更有效地缓解潜在的 GC 裙带关系问题。
但是,Quarkus 可能仍会选择保留空间/时间作为选项。空间/时间中缺少幸存者空间意味着年轻的对象很容易在老一代中堆积,直到完全 GC,从而导致内存消耗的潜在峰值。此外,在某些情况下,一些开发人员可能仍然更喜欢空间/时间的可预测性。
这两种政策都存在潜在风险。空间/时间策略需要通过一个非公开的 API ( -H:) 来设置,从长远来看这可能是不可持续的。另一方面,切换到自适应 GC 可以产生更少的 full GC 事件,这是 space/time 的主要特征之一。串行 GC 老年代也可以从复制切换到标记-清除-紧凑,这将需要进一步评估完整 GC 的成本。
Quarkus 可能会转向自适应 GC 策略,这凸显了根据情况选择正确的 GC 策略的重要性。开发人员必须考虑物理内存、工作负载压力水平和低内存占用需求等因素。深入了解GC 策略可以帮助开发人员优化应用程序性能并最大限度地减少内存消耗。
有兴趣了解更多关于调查 Quarkus 中本机内存使用情况的开发人员可以参考原始GitHub 问题以获取更多详细信息。Quarkus 还通过在他们的参考指南中添加一个名为“本机内存管理”的新部分,使开发人员更容易优化他们的应用程序使用内存的方式。通过利用这些资源,开发人员可以更深入地了解他们的应用程序如何使用内存,并做出更明智的决策来提高性能。