已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
背景
在 ARM Cortex-A53(2C4G,8GB eMMC)的边缘网关上跑 K3s v1.31 + containerd 1.7.x,业务是一个 Java 17(Temurin)网关代理容器:request=limit=2500Mi。之前按大服务器习惯给 -Xmx2g,其余 native 内存(Metaspace、线程栈、DirectByteBuffer、JIT code cache、glibc arena)全靠默认值。
现象
dmesg 里是 cgroup OOM,但 JVM 日志显示 used heap 只到 1.4G 左右,堆远没到 -Xmx。memory.available<100Mi 驱逐阈值,Pod 被驱逐后 JVM 直接 SIGKILL,连 graceful shutdown 都没跑完。pmap 抓过进程:RSS ≈ 堆 1.4G + Metaspace 380M + 线程栈(180 线程 × 1M)≈ 220M + Direct 40M + code cache 80M + 其余匿名页 300M+,native 部分合计比预期高出 400M~600M。已尝试
-Xmx2g → 1.5g 再压,仍偶发 OOMKilled,说明 native 部分有我没算到的变量(怀疑 direct memory + arena 随并发线程数浮动)。-XX:MaxDirectMemorySize=256m、-XX:MaxMetaspaceSize=256m、-XX:ReservedCodeCacheSize=64m 显式封顶,OOM 频率下降但还没压成零。期望得到的答案形态
free -h / ps aux --sort=-rss 的真实数字最好)?limit = 节点 - 保留 - native 余量)?NMT 或 pmap 的定量方法可以固化成 CI 检查?