Java 17 个应用在 docker 中显示非常高的 RAM 使用率

Java 17 app shows very high RAM usage in docker

我有一个应用程序,在空闲时间通常只需要 1GB 的 RAM,但是当我在 docker 中启动它时,它从外部显示更高的 RAM 使用率 (5GB)。 JVM 指标显示我仍然只使用了大约 1GB 的 RAM,但 JVM 并没有真正释放它曾经声称的任何 RAM。 我无法降低 RAM 限制(~8GB,使用 MaxRamPercentage),因为它在高负载、启动和一些特殊事件期间需要它。我可以定期调用 System.gc(),因为这会释放大量内存,但 RAM 会在几次请求后恢复到原来的位置。这种对未使用 RAM 的声明浪费了大量资源,并导致服务器出现 OOM,因为 none 应用程序释放了它们的内存。

据此JEP-346“错误”已修复,导致垃圾收集器不释放内存,但我没有看到任何改进。

出于测试目的,我还尝试使用 -XX:+UseShenandoahGC 并按预期释放内存。但是在启动过程中,它几乎占用了所有 RAM,这会在 server/multiple 同时应用程序重新启动期间导致问题。

TLDR:实际使用 RAM ~1 GB,声称 RAM ~5 GB,RAM 限制 ~8GB。 如果不显式调用 System.gc(),默认 GC 不会释放足够的 RAM。 G1 GC 是 Java17 中的默认 GC 吗? (这是事实) 是否需要任何参数才能使 JEP-346 的更改按预期工作?

我觉得.

正如问题评论中指出的那样,此功能是可选的,可以使用 JEP 346 Documentation 中描述的参数启用。

-XX:G1PeriodicGCInterval-XX:G1PeriodicGCSystemLoadThreshold 都必须设置为大于默认值 0 才能使功能正常工作。