Docker 容器内存一直增长被 OOM Killer 的问题

155 天前
 JamesTao
在两台服务器上使用 docker 部署了相同的服务
基础镜像是 openjdk:17-oracle, 容器限制了 2G 内存
容器内运行了 springboot, JAVA_OPTS 设置为 -Xms512m -Xmx1536m
容器运行一段时间后, 被系统 oom killer, 被 kill 前观测到容器使用内存接近 2G. 进入容器用 top 命令查看, java 占用内存和容器使用内存保持一致, 都是接近 2G
两个容器均发生此现象

在排除 jvm heap 内存泄漏后. 做了如下调整
JAVA_OPTS 设置为 -Xms750m -Xmx750m -XX:MaxDirectMemorySize=750m, 进入容器查看 NMT 数据如下




现在的问题是
1. 为什么两个容器实际使用的内存不一样, 但是 NMT 的数据几乎一致
2. 如何定位和解决现在 java 内存一直在增长并造成 oom killer 的问题

谢谢
2382 次点击
所在节点    Java
9 条回复
FaustY
155 天前
之前遇到过类似的,换了 oracle jdk 的容器就好了
FaustY
155 天前
自己打基础镜像或者用 bitnami/java
lingcen000
154 天前
实际就是堆外内存一直增长导致的,加了限制就好了
guanzhangzhang
154 天前
有个最常见问题就是,低版本 jdk 无法识别 cgroup 内存限制
JamesTao
154 天前
@lingcen000 请问下如何限制堆外内存呢?

@guanzhangzhang 用的基础镜像也是官方的, 系统和 jdk 的版本应该都对上吧
zhady009
154 天前
容器限制了 2G, JVM 最大堆 1536m 堆外一般不会那么大具体得看你啥应用, 排查的话用 JFR 看事件很容易就能看出来
fredcc
153 天前
堆内存只是一部分,还有其他内存消耗。为什么慢慢变大上工具分析咯。比如
https://arthas.aliyun.com/doc/expert/user-question-history13508.html
zhongpingjing
151 天前
堆外内存只能限制元空间还有直接内存,但是堆外内存不止这两个,所以解决方案就是把最大堆内存调低一些
JamesTao
150 天前
JFR, Arthas 似乎都是分析 jvm 内存的. 但是从现象上看, jvm 内存没有问题. 一直增大的是 jvm 外的内存

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1123083

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX