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

Should we set -Xmx (max java heap size) in a kubernetes container

TLDR;

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


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

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

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

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

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

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