You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 01:26:07