Multithreading 如何找出哪个tomcat webapp存在线程泄漏?

Multithreading 如何找出哪个tomcat webapp存在线程泄漏?,multithreading,tomcat,jconsole,Multithreading,Tomcat,Jconsole,在一个运行3个Tomcat webapps的生产系统中,我们最近注意到Tomcat由于线程泄漏而崩溃。三个webap中的两个相互作用,我想找出这两个组件中的哪一个导致了线程的累积 问题:找出3个Web应用程序中哪一个存在线程泄漏的好方法/工具是什么 我的java技能非常生疏。我对Tomcat不是很熟悉,随着时间的推移我会发现。 我启动了jconsole,以了解线程泄漏的情况。我不愿意安装其他(或非默认)工具来解决此问题,因为这是一个生产系统 在下面的jconsole屏幕截图中,您可以看到线程数在

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

问题:找出3个Web应用程序中哪一个存在线程泄漏的好方法/工具是什么

我的java技能非常生疏。我对Tomcat不是很熟悉,随着时间的推移我会发现。 我启动了
jconsole
,以了解线程泄漏的情况。我不愿意安装其他(或非默认)工具来解决此问题,因为这是一个生产系统

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

根据请求

  • 连接器
    元件:

  • 我所说的“Tomcat崩溃”是指没有更多的事件被记录到
    catalina.log
    文件中,以及3个webapps的所有日志文件中。只有底层apache正在记录事件,其中包含HTTP 500错误


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

不确定您是否有在系统上部署新代码的特权

在类似情况下帮助我的最简单的更改(也使用tomcat)是给每个执行器/线程池/线程一个有意义的名称,这个名称可以追溯到webapp和创建线程的模块


瞧,线程转储突然看起来很友好。这也是在紧要关头通过番石榴完成的/

谢谢你的回答。然而,这是一个生产系统,所以说实话,我想避免这么大的变化。我希望有一种不太复杂的方法……另一种方法是这样做,但只能在单独的性能测试环境中,并模拟用户使用Selenium、JMeter、Gatling或类似工具访问系统。这是一个Tomcat实例吗?Tomcat“崩溃”是什么意思?请编辑您的问题,将Tomcat的
conf/server.xml
文件中的活动
元素包括在内。请记住清理任何机密信息,如密码。@ChristopherSchultz:done。不确定我插入的
连接器
信息是否就是您要查找的,但Tomcat进程是否还在运行?Tomcat变得完全惰性是很不寻常的。如果进程正在运行,则进行线程转储并查看所有线程都在做什么。该连接器上的线程限制为600,因此必须有其他东西在创建这些额外线程。日志文件中是否有任何东西可以解释发生了什么?jstack没有给出任何提示的线索(它应该显示一段时间后空闲的大量线程…)