通过JVM堆栈出现大量WAITING线程的原因。
使用ps -ef|grep tomcat8080 找到运行项目的进程id
使用jstack命令把该进程的堆栈导进一个文件
使用
grep java.lang.Thread.State dump | awk '{print $2$3$4$5}' | sort | uniq -c
命令查看线程状态分类
-
根据WAITING状态去查找,找到
最后排查到两个问题。
- 每个模块都自己新建自己的线程池,线程池创建不合理,导致空闲线程比较多
- 在代码中使用ExecutorService提交线程任务后,未关闭。
总结:
- 线程池这种底层资源的提供,没有特殊情况下应该统一提供。而不是每个模块都自己来新建个线程池。
- 需要合理配置线程池。
- 创建线程池或者新启动线程时,最好给线程起个名字,这样出现问题好定位
配置线程池的策略: