容器的内存限制,看到的和限制的不是一回事
容器里 free -h 显示宿主机 64G,-m 1g 的限制看起来没生效。实际上 free 读 /proc/meminfo,而容器没有独立的 meminfo,看到的就是宿主机的。
真正的限制在 cgroup:
cat /sys/fs/cgroup/memory.max # cgroup v2
cat /sys/fs/cgroup/memory.current
cat /sys/fs/cgroup/memory.stat | grep -E 'anon|file'
memory.current 包含 page cache。所以一个只读文件的容器,current 会慢慢涨到接近上限——这不是泄漏,是缓存,内核在压力下会回收。真正该看的是 anon(匿名页,即堆栈和堆),它才对应应用实际占用的内存。
Java 容器还有一个坑:老版本 JVM 读不到 cgroup 限制,按宿主机内存算堆大小,一启动就被 OOM kill。JDK 10 以后默认 UseContainerSupport,老版本要手动加 -XX:MaxRAMPercentage。