如何找出哪个tomcat webapp有线程泄漏?

时间:2018-04-27 07:35:14

标签: multithreading tomcat jconsole

在一个运行3个Tomcat webapps的生产系统中,我们最近注意到Tomcat由于线程泄漏而崩溃。三个webaps中的两个是相互交互的,我想找出导致这个线程建立的两个组件中的哪一个。

问题:找出3个webapps中有哪些漏洞有什么好方法/工具?

我的java技能非常生疏。我对Tomcat不太熟悉,并且随着我的发展而发现。 我启动jconsole来了解线程泄漏。我不愿意安装其他(或非默认)工具来解决这个问题,因为这是一个生产系统。

在下面的jconsole截图中,您可以看到线程数增长; Tomcat / catalina进程在08:52停止,在线程数达到893个线程后几分钟。

jconsole

按要求,

  • 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错误。

2 个答案:

答案 0 :(得分:1)

不确定您是否可以在系统上部署新代码。

在类似的情况下帮助我的最简单的改变 - 也使用tomcat - 是给每个执行器/线程池/线程一个有意义的名称,一个可以追溯到webapp 模块创造了这个主题。

Voila,线程转储看起来很友好。这也是通过guava / ThreadFactoryBuilder来完成的。

答案 1 :(得分:0)

在不同的Tomcat实例中运行每个Web应用程序。您可能在Tomcat前面有一些nginx / Apache实例,负载均衡器或类似的东西,您可以将其重新配置为指向每个Web应用程序的单独Tomcats。