java - Docker 内存限制对 Centos 7 主机中的 Java 应用程序无效
问题描述
我正在尝试在 1 个主机的 docker 容器中部署多个 Java(spring boot)应用程序,并(--memory=30m --memory-swap=50m)
为每个主机设置内存限制。
但是,当我使用 docker 容器统计信息检查限制时,我看到每个容器都在使用 >400MB
主机的 RAM。由于这个原因,我无法启动我需要的所有容器,因为内核会杀死其中一些(OOM
)。
我需要做些什么来确保使用 docker 内存选项控制容器的内存?
我的主机是数字海洋centos 7。谢谢
解决方案
此问题的主要原因是 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/
推荐阅读
- ms-word - 查找并用递增值替换 word 中的数字
- docker - nodemcu Docker 构建环境
- sql - 如何同时使用 Sql Insert 和 Update?
- php - 在数组中循环遍历数组的最有效方法
- java-8 - 对方法的引用是模棱两可的方法引用与 lambda
- vba - SAP 查询 64 位 WIN 和 OFFICE 上的 RFC 连接“ActiveX 组件无法创建对象”
- c# - 编码的 UI - 断言无法检测到专有的 WPF 控件
- mysql - Sequelize JS 插入错误
- django - python Django模型视图集-获取当前用户ID
- angular - 角空白页没有错误