OpenJDK 17升级后容器因JIT编译器内存过高OOMKilled求助
OpenJDK 17升级后容器OOMKilled问题排查求助
问题背景
近期将Web应用从OpenJDK 8升级至OpenJDK 17后,测试中发现容器因*OOMKilled(状态码137)*被终止,Java日志仅打印"Killed"。排查后确认堆内存利用率始终在1GB以内,GC工作正常,问题出在本地内存消耗上——通过jcmd <PS_ID> VM.native_memory采集数据显示,Compiler内存占用出现异常暴涨。
当前配置信息
JVM参数
-Xms1024m -Xmx1024m -XX:InitiatingHeapOccupancyPercent=40 -XX:MaxDirectMemorySize=256m -XX:MaxMetaspaceSize=256m -server -Xdebug -Xrunjdwp:server=y,transport=dt_socket,suspend=n -XX:+UseG1GC -Dfile.encoding=UTF-8 -DIGNITE_UPDATE_NOTIFIER=false -Xlog:gc:/var/log/service-gclog.txt -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/dump -XX:+ExitOnOutOfMemoryError -XX:+FlightRecorder
容器环境与内存详情
容器基于Alpine-3.17.3构建,采用cgroupv2配置。容器内存详情如下:
Continer Memory Details Runtime.availableProcessors: 2 OperatingSystemMXBean.getAvailableProcessors: 2 OperatingSystemMXBean.getTotalPhysicalMemorySize: 2684354560 OperatingSystemMXBean.getFreePhysicalMemorySize: 1241612288 OperatingSystemMXBean.getTotalSwapSpaceSize: 0 OperatingSystemMXBean.getFreeSwapSpaceSize: 0
POD初始分配内存为2GB,曾尝试提升至2.5GB,仍触发OOMKilled。
测试场景与内存数据对比
- 测试场景:通过JMeter创建采购订单,每个订单调用约7个API,服务在创建约50个订单时失败
- 初始Compiler内存占用:
- Compiler (reserved=1013KB, committed=1013KB) (malloc=849KB #1601) (arena=165KB #5)
- 容器终止前Compiler内存占用:
- Compiler (reserved=678349KB, committed=678349KB) (malloc=1729KB #2690) (arena=676621KB #13)
可见容器终止前Compiler内存占用已达约678MB。
已尝试的优化参数及效果
已测试以下JVM参数,除禁用内联外均无实质效果:
- 禁用IncrementalInline:无改善
- 启用IncrementalInlineForceCleanup:无改善
- 禁用Inline:有效降低内存消耗,但会影响应用性能,不希望采用该方案
- 禁用InlineUnsafeOps:可降低部分内存,但新增测试场景(调用订单创建外的其他API)后内存仍会上升并触发OOMKilled
- 将MaxInlineLevel降至9:无改善
- 禁用UseInlineCaches:无改善
- 禁用TieredCompilation:无改善
求助问题
- 是否有其他方法可以限制Compiler内存的异常消耗?
- 除Compiler内存外,还有哪些方面需要进一步排查?
内容的提问来源于stack exchange,提问作者Viraj C
相关产品推荐
相关产品推荐

