You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring MVC项目Tomcat 9首次关闭失败及AQ线程内存泄漏问题咨询

Tomcat首次无法正常关闭原因排查与修复

根因定位

从日志可以直接定位到核心问题:你开发的Books应用启动的名为AQThread的自定义线程未在应用销毁时被主动停止,非守护线程会阻止JVM正常退出,因此首次触发关闭命令无法停止Tomcat进程,第二次关闭是触发了强制终止信号才会成功。
具体有两个直接诱因:

  • AQThread当前要么处于Thread.sleep休眠状态,要么阻塞在Oracle AQ队列的dequeue出队方法的底层网络IO调用上,这两个状态都不会响应Tomcat默认的应用销毁信号,线程会一直处于存活状态。
  • 现有代码未实现任何资源释放逻辑:代码中的数据库连接、AQ会话均未配置生命周期管理,Spring MVC应用销毁时不会触发线程中断、连接关闭操作,最终触发Tomcat的内存泄漏告警。

修复方案

  • 优化AQThread的运行逻辑:Oracle AQ出队操作设置合理的超时时间,不要永久阻塞,同时在循环逻辑中增加中断状态判断,收到中断信号时主动终止运行、关闭所持有的资源。
  • 增加应用销毁钩子:给队列处理类添加@PreDestroy注解的销毁方法,方法内主动中断AQThread,同时关闭所有打开的数据库连接、AQ会话。
  • 优化数据库连接管理:建议使用数据库连接池统一管理连接,不要每次操作都新建OracleDataSource,销毁阶段统一关闭连接池,避免连接泄漏。

内容的提问来源于stack exchange,提问作者Mansal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 13:06:01