V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JamesTao
V2EX  ›  Java

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

  •  
  •   JamesTao · 22 小时 20 分钟前 · 790 次点击
    在两台服务器上使用 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 的问题

    谢谢
    6 条回复    2025-04-04 00:47:55 +08:00
    FaustY
        1
    FaustY  
       22 小时 14 分钟前
    之前遇到过类似的,换了 oracle jdk 的容器就好了
    FaustY
        2
    FaustY  
       22 小时 13 分钟前
    自己打基础镜像或者用 bitnami/java
    lingcen000
        3
    lingcen000  
       17 小时 3 分钟前
    实际就是堆外内存一直增长导致的,加了限制就好了
    guanzhangzhang
        4
    guanzhangzhang  
       16 小时 50 分钟前
    有个最常见问题就是,低版本 jdk 无法识别 cgroup 内存限制
    JamesTao
        5
    JamesTao  
    OP
       12 小时 55 分钟前
    @lingcen000 请问下如何限制堆外内存呢?

    @guanzhangzhang 用的基础镜像也是官方的, 系统和 jdk 的版本应该都对上吧
    zhady009
        6
    zhady009  
       9 小时 35 分钟前
    容器限制了 2G, JVM 最大堆 1536m 堆外一般不会那么大具体得看你啥应用, 排查的话用 JFR 看事件很容易就能看出来
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2311 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 02:22 · PVG 10:22 · LAX 19:22 · JFK 22:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.