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

升级Tomcat8到Tomcat9后热部署war包服务无响应问题求助

大量用户升级至Tomcat9后都在热部署场景下遇到过相同的无响应问题,该问题主要和Tomcat9的两大机制调整有关:

  • 热部署类加载回收逻辑更新:Tomcat9新增了多项内存泄漏预防机制,热部署卸载旧应用时,若旧应用存在未关闭的线程、数据库连接或者静态资源引用,类加载器无法被完全回收,会持续占用系统资源。
  • AJP连接器默认逻辑变更:Tomcat9对AjpNio2Protocol的连接复用规则做了调整,热部署后残留的旧连接不会被主动清理,你当前配置的connectionTimeout为1800000(30分钟),过长的超时时间会导致旧连接长期占用工作线程,多次热部署后线程池被完全占满,就会出现无响应、无错误日志的现象。

对应的修复方案如下:

临时适配方案(保留热部署能力)

调整AJP连接器配置,优化连接释放逻辑:

<Connector
        port="8009"
        protocol="org.apache.coyote.ajp.AjpNio2Protocol"
        acceptCount="200"
        acceptorThreadCount="2"
        address="0.0.0.0"
        connectionTimeout="30000"
        maxConnections="800"
        maxThreads="400"
        minSpareThreads="20"
        secretRequired="false"
        redirectPort="8443" />

同时在server.xml的<Host>节点新增属性unloadDelay="2000",给旧应用预留足够的资源回收时间,可大幅降低无响应出现概率。

生产环境稳定方案

Tomcat官方自9.0版本起明确说明,热部署仅适用于开发测试场景,生产环境建议停止Tomcat进程后替换war包,再重启服务,从根源上避免类加载器泄漏导致的线程阻塞问题。

问题排查方案

下次出现无响应时不要立刻重启服务,执行jstack [Tomcat进程ID] > stack.log导出线程栈,搜索AjpNio2相关线程的状态,即可确认是否为线程池占满导致的阻塞。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 20:06:03