multithreading - 如何找出哪个tomcat webapp有线程泄漏?
问题描述
在一个运行 3 个 Tomcat webapps 的生产系统中,我们最近注意到 Tomcat 由于线程泄漏而崩溃。三个 webap 中的两个相互影响,我想找出这两个组件中的哪一个导致了这个线程的建立。
问题:有什么好的方法/工具可以找出 3 个 webapp 中的哪个有线程泄漏?
我的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" />
通过“Tomcat 崩溃”,我的意思是不再将事件记录到
catalina.log
文件中,也没有记录到 3 个 webapps 的日志文件中。只有底层 apache 正在记录事件,带有 HTTP 500 错误。
解决方案
不确定您是否可以在系统上部署新代码。
在类似情况下帮助我的最简单更改(也使用 tomcat)是给每个执行程序/线程池/线程一个有意义的名称,该名称可以追溯到 webapp和创建线程的模块。
瞧,线程转储突然看起来很友好。这也是在紧要关头通过 guava/ ThreadFactoryBuilder完成的。
推荐阅读
- python - 无法从python中的日期时间字符串中提取日期?
- javascript - 为什么我不能通过下面的功能访问“this”?
- python - 在 Tkinter 中显示数学
- javascript - 在 javascript 中使用 localStorage 时,尽管已定义密钥,但仍返回 null
- mysql - 如果我们匹配多条记录,如何获取 MySQL 表中的可用记录?
- c++17 - 是否可以检查类型或类的重载 operator<< 是否存在?
- apache-spark - 为什么解析字符串列时的 to_date 函数为 Pyspark 中的某些记录提供空值
- c# - 如何将项目添加到 IEnumerable 中填充的对象的类列表中
- android - 如何让 Android 知道文件系统中手动添加的文件夹
- domain-driven-design - CQRS+DDD 命令端通过 id 查询其他聚合根