SpringBoot运行大量REST请求出现JRE insufficient memory错误排查求助
问题排查方向
- 开启JVM Native Memory Tracking定位泄漏来源:启动时追加参数
-XX:NativeMemoryTracking=detail,运行过程中执行jcmd <进程PID> VM.native_memory summary scale=MB查看Native内存各分区占用,重点关注Code Cache、Direct Buffer、Thread、Internal等分区的增长趋势,确认泄漏发生的具体区域。 - 验证Apache Camel组件配置:检查是否开启了不必要的消息追踪、历史Exchange快照留存功能,是否存在全局静态集合持有请求上下文、消息对象的情况,这类引用不会被GC回收,会持续占用内存。
- 排查内嵌Tomcat连接泄漏:查看Tomcat连接数、超时配置是否合理,是否存在长连接未释放、请求体缓冲区无大小限制的问题。
- 检查系统缓存占用:执行
free -h查看内存结构,确认持续下降的内存是否被系统Page Cache、Buffer占用,而非Java进程本身占用。
优化落地建议
JVM参数优化
- 解决Native堆地址空间不足问题:追加参数
-XX:HeapBaseMinAddress=32g,将Java堆放置在32G虚拟地址空间以上,避免压缩指针限制Native堆的增长空间。 - 限制堆外内存上限:追加参数
-XX:MaxDirectMemorySize=4G,避免Direct Buffer无限制申请堆外内存。 - 降低线程栈占用:追加参数
-Xss512k,将单线程栈大小从默认1M调整为512K,减少线程栈的整体内存开销。 - 优化GC策略:追加参数
-XX:+ExplicitGCInvokesConcurrent,允许显式GC触发并发回收,确保堆外内存关联的幻引用能被及时处理。
应用配置优化
- 生产环境禁用Swagger:若无需在线接口文档,可在启动参数追加
springfox.documentation.enabled=false关闭Swagger,旧版本SpringFox存在元数据缓存泄漏问题,也可替换为内存占用更低的SpringDoc组件。 - 调优内嵌Tomcat配置:在application.yml中添加以下配置,限制连接数和缓冲区大小:
server: tomcat: max-connections: 200 keep-alive-timeout: 30s max-http-post-size: 2MB connection-timeout: 5s
- 裁剪Camel冗余功能:关闭Camel的消息 tracing、死信队列默认持久化等非必要功能,确保每个请求处理完成后Exchange对象被正确销毁,无残留引用。
系统层面优化
- 调整swap使用策略:执行
sysctl -w vm.swappiness=10,并将vm.swappiness=10写入/etc/sysctl.conf永久生效,降低系统优先使用swap的概率,避免物理内存闲置但swap占满的问题。 - 定期清理系统缓存:配置定时任务执行
echo 3 > /proc/sys/vm/drop_caches,定期清理系统页缓存、目录项缓存,无需重启虚拟机即可释放被缓存占用的内存。
内容的提问来源于stack exchange,提问作者SP.
相关产品推荐
相关产品推荐

