首页 > 解决方案 > Docker 内存限制对 Centos 7 主机中的 Java 应用程序无效

问题描述

我正在尝试在 1 个主机的 docker 容器中部署多个 Java(spring boot)应用程序,并(--memory=30m --memory-swap=50m)为每个主机设置内存限制。

但是,当我使用 docker 容器统计信息检查限制时,我看到每个容器都在使用 >400MB主机的 RAM。由于这个原因,我无法启动我需要的所有容器,因为内核会杀死其中一些(OOM)。

我需要做些什么来确保使用 docker 内存选项控制容器的内存?

我的主机是数字海洋centos 7。谢谢

标签: javadockercentos7

解决方案


此问题的主要原因是 JRE 不知道它正在容器内运行。

让 JVM 检测 Docker 容器中有多少可用内存 https://blog.csanchez.org/2017/05/31/running-a-jvm-in-a-container-without-getting-killed

JAVA_OPTS="-server -Djava.net.preferIPv4Stack=true -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1"

确保您拥有 JDK 8-131 或更高版本
如果是 JDK-9,它将可用于正确检测容器内的可用内存。

附加参考:Docker run -m 没有设置限制(JVM 占用了整个主机的 xms 和 xmx 大小)

https://developers.redhat.com/blog/2017/03/14/java-inside-docker/


推荐阅读