Docker容器内JVM无法识别cgroups内存限制问题排查
问题:Docker内存限制无法被Amazon Corretto 24 JVM识别
系统环境
- CachyOS(基于Arch的Linux发行版)
- Docker版本:28.1.1
- Cgroup驱动:systemd
- Cgroup版本:2
问题描述
执行以下命令后:
docker run --rm -m 1gb public.ecr.aws/amazoncorretto/amazoncorretto:24 java -XshowSettings:vm -version
JVM显示最大堆内存为15.68G(主机内存的25%),而非预期的约250MB,Docker设置的内存限制完全未生效。
测试对比
在AWS EC2实例上执行相同命令,JVM可正常识别限制,最大堆内存为247.50M。
调试信息
添加-Xlog:os+container=trace参数后,日志明确显示cgroups的memory控制器未启用,问题根源指向系统或cgroup配置。
解决方法
1. 启用系统Cgroup v2内存控制器
先检查当前系统是否加载了memory控制器:
cat /sys/fs/cgroup/cgroup.controllers
如果输出中没有memory,按以下步骤启用:
- 编辑
/etc/default/grub,找到GRUB_CMDLINE_LINUX行,追加参数:systemd.unified_cgroup_hierarchy=1 cgroup_memory=1 cgroup_enable=memory - 更新GRUB配置:
sudo grub-mkconfig -o /boot/grub/grub.cfg - 重启系统后再次验证控制器状态。
2. 确认Docker的Cgroup配置正确性
确保Docker使用systemd cgroup驱动,检查/etc/docker/daemon.json(不存在则创建):
{ "exec-opts": ["native.cgroupdriver=systemd"], "features": { "buildkit": true } }
重启Docker服务使配置生效:
sudo systemctl restart docker
3. 强制JVM识别容器限制
如果系统配置正常但JVM仍未识别,可显式声明启用容器支持:
docker run --rm -m 1gb public.ecr.aws/amazoncorretto/amazoncorretto:24 java -XX:+UseContainerSupport -XshowSettings:vm -version
极端情况下也可以直接指定堆内存上限:-Xmx256m。
4. 验证容器的Cgroup内存限制
进入容器检查内存限制是否正确传递:
docker run --rm -m 1gb public.ecr.aws/amazoncorretto/amazoncorretto:24 cat /sys/fs/cgroup/memory.max
正常输出应为1073741824(1GB对应的字节数),若不是则说明Docker与systemd的cgroup集成存在问题,需排查Docker服务的运行日志。
内容的提问来源于stack exchange,提问作者Matheus
相关产品推荐
相关产品推荐

