我们应该在 kubernetes 容器中设置 -Xmx (最大 java 堆大小)吗

问题描述 投票:0回答:3

TLDR;

为什么要在 kubernetes 应用程序中设置

-Xmx
-Xms


我们继承了一个存在内存不足错误的 kubernetes 应用程序。看起来最初的开发人员设置了 kubernetes 资源限制(0.95 CPU 核心和 4Gb 内存),如下所示。但是,他们还将

JAVA_OPTS -Xmx
中的最大堆大小设置为 800mb。

我发现了很多关于

-Xmx
最佳设置的好材料(例如 这个),但无法找到以下问题的直接答案:我们真的需要设置
-Xmx
(不太重要的是,
-Xms
)在 kubernetes 容器中?我们已经对容器设置了硬性限制
resources
,那么设置这些标志有什么意义呢?如果我们把它们全部删除,结果会是什么?应用程序 GC 会更频繁吗?它会动态缩放堆大小还是将堆大小最大值固定为某个默认最大值(例如 256MB)?是否有任何与 kubernets 容器成比例设置
-Xmx
的经验法则?

java kubernetes heap-memory
3个回答
4
投票

如果您没有设置最大堆大小,则行为取决于所使用的 java 版本。当前的 JRE 支持确定容器限制并使用它来指导其内部启发式方法。

当使用旧版本运行时,用于堆的内存将根据容器可见的物理内存确定,这可能会过多。

请注意,达到容器的内存限制将导致终止进程并重新启动容器。

我建议您对 Xmx 和 Xms 使用根据操作测试确定的合理值,以获得稳定的内存使用情况。


0
投票

使用 Xms 和 Xmx 设置堆最小值和最大值。不要使用 MaxRAMPercentage,因为当 Java 不再工作时(如 Kubernetes 迁移到 cgroups v2 时),JVM 将默认某些值不正确并导致失败。

来源:https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8230305


-1
投票

从 Java 10 和 Java 8u191 开始,Java 应该有很好的支持来确定容器中的实际可用内存。不再需要使用

-Xmx
了。建议使用
XX:MaxRAMPercentage
,其值范围在 75.0 到 80.0 之间(例如
XX:MaxRAMPercentage=75.0

来源:
https://www.atamanroman.dev/development/2019/09/11/usecontainersupport-to-the-rescue.html https://pretius.com/blog/jvm-kubernetes/

© www.soinside.com 2019 - 2024. All rights reserved.