现象:容器内存限制 2G,Java 服务跑着跑着就被 kill,日志里只有 exit code 137。
排查过程:
- docker stats 看到内存一路涨到 2G 然后归零
- 宿主机 free 还有富余,不是物理内存不够
- jmap 看堆只有 700M
原因:JVM 默认按宿主机内存算堆大小,容器里它看到的是宿主机的 32G,于是 Xmx 默认给到 8G。堆没涨到那么多,但加上元空间、线程栈、直接内存,超了容器的 2G。
解法:加 -XX:MaxRAMPercentage=70,或者显式 -Xmx1200m。JDK 10 以后 cgroup 一般是认的,但有些基础镜像的 JVM 参数文件会覆盖掉自动探测。
顺手加了个启动时打印内存参数的日志,以后一眼能看出来。这个问题折腾了两天,教训是:容器里跑 JVM,内存参数一定要显式写。
主楼支持这个观点,工具描述比模型选择重要。
看完去改了我的 CLAUDE.md,确实清晰多了。
有没有人试过在 ARM 机器上跑,性能差多少?
继续逛逛