【问题标题】:Should we set -Xmx (max java heap size) in a kubernetes container我们是否应该在 kubernetes 容器中设置 -Xmx(最大 Java 堆大小)
【发布时间】:2021-11-18 02:05:25
【问题描述】:

TLDR;

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


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

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

【问题讨论】:

    标签: java kubernetes heap-memory


    【解决方案1】:

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

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

    注意,达到容器的内存限制会导致杀死进程并重新启动容器。

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

    【讨论】:

    • (请注意,“当前 JRE”包括大约 2 年前的旧 JRE 构建,如 OpenJDK 8;如果您的基础基础设施定期更新,那么您应该支持根据以下条件自动确定堆大小资源限制。)
    • 好的,谢谢!我将在云中查看我们当前的 JDK。
    猜你喜欢
    • 2015-07-07
    • 2011-08-29
    • 2015-04-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    相关资源
    最近更新 更多