求助调试K8s中Spring Boot应用JVM内存持续增长问题
Kubernetes中Spring Boot 3.2.9(Java 21)应用OOMKiller问题排查求助
首次发帖,如有疏漏请见谅。我有一个运行在Kubernetes(k3s)中的Spring Boot 3.2.9应用,基于Java 21(Adoptium JDK Ubuntu Jammy镜像)部署。目前遇到的问题是无法合理设置container.limits.memory值,应用频繁被OOMKiller终止。
应用启动命令如下:
java \ -XX:NativeMemoryTracking=detail \ -XX:StartFlightRecording=delay=1m,duration=8h,maxsize=2g,settings=profile,filename=/data/uaa.jfr \ -XX:+PrintFlagsFinal \ -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 \ -Xms128m \ -Xmx256m \ -XX:+UseG1GC \ -XX:MaxDirectMemorySize=256m \ -XX:MaxMetaspaceSize=256m \ -Xlog:gc:file=/tmp/gc.log \ -Dserver.port=10000 \ -Djava.net.preferIPv4Stack=true \ -Dfile.encoding=UTF-8 \ -Dsun.jnu.encoding=UTF-8 \ -Dspring.profiles.active=core \ -Dspring.config.import="kubernetes:" \ -jar \ /opt/backends/uaa.jar
如上述启动参数所示,我已经配置了堆内存、元空间、直接内存等多项限制,但并未起到预期效果。测试时给Pod设置了5GB内存上限,启动后通过JFR记录了2小时的内存使用情况,仅观察到Java Mission Control中的"Total Size"持续增长,该数值与kubectl top pod输出的内存用量大致匹配。
按照理论计算,堆内存(256m)+元空间(256m)+直接内存(256m)加上约5%的额外开销,总内存应该不超过768MB,但实际无论设置多大的容器内存上限,应用最终都会被OOMKiller终止。
现在需要排查内存增长的原因及解决办法,恳请提供内存泄漏排查方向,以及Java 21中可配置的额外内存限制选项。
参考信息:
- 启动时内存使用情况截图
- 运行约1小时后内存使用情况截图
- 与本地内存使用相关的JFR事件截图
运行约142分钟时kubectl top pod输出:
NAME CPU(cores) MEMORY(bytes) uaa-85bf44c694-t8qxf 18m 1028Mi
内容的提问来源于stack exchange,提问作者user27204112
相关产品推荐
相关产品推荐

