在一个运行3个Tomcat webapps的生产系统中,我们最近注意到Tomcat由于线程泄漏而崩溃。三个webaps中的两个是相互交互的,我想找出导致这个线程建立的两个组件中的哪一个。
问题:找出3个webapps中有哪些漏洞有什么好方法/工具?
我的java技能非常生疏。我对Tomcat不太熟悉,并且随着我的发展而发现。
我启动jconsole
来了解线程泄漏。我不愿意安装其他(或非默认)工具来解决这个问题,因为这是一个生产系统。
在下面的jconsole截图中,您可以看到线程数增长; Tomcat / catalina进程在08:52停止,在线程数达到893个线程后几分钟。
按要求,
Connector
元素:<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" maxThreads = "600" minSpareThreads = "150" acceptCount = "150" connectionTimeout = "30000" />
by&#34; Tomcat崩溃&#34;,我的意思是没有更多的事件记录到catalina.log
文件中,也没有记录在3个webapps的任何日志文件中。只有底层的apache正在记录事件,HTTP 500错误。
答案 0 :(得分:1)
不确定您是否可以在系统上部署新代码。
在类似的情况下帮助我的最简单的改变 - 也使用tomcat - 是给每个执行器/线程池/线程一个有意义的名称,一个可以追溯到webapp 和模块创造了这个主题。
Voila,线程转储看起来很友好。这也是通过guava / ThreadFactoryBuilder来完成的。答案 1 :(得分:0)
在不同的Tomcat实例中运行每个Web应用程序。您可能在Tomcat前面有一些nginx / Apache实例,负载均衡器或类似的东西,您可以将其重新配置为指向每个Web应用程序的单独Tomcats。