阅读量:2
一、日志分析与定位
-
查看关键日志文件
catalina.out:记录启动、停止及错误信息,搜索ERROR、Exception、Deadlock等关键词。localhost.:包含应用相关线程异常,如.log java.lang.ThreadDeath。
-
分析线程状态
- 日志中若出现
BLOCKED、WAITING、TIMED_WAITING等状态线程,可能为死锁或资源竞争。 - 示例:
"http-nio-8080-exec-1" #123 prio=5 os_prio=0 tid=0x00007f8c00001234 nid=0x1234 waiting for monitor entry,表示线程因锁阻塞。
- 日志中若出现
二、常用诊断工具
-
jstack生成线程转储
- 命令:
jstack,分析线程调用栈,查找死锁或长时间阻塞的线程。> thread_dump.txt - 工具辅助:用
fastthread.io在线分析转储文件,识别死锁模式(如AB-BA锁竞争)。
- 命令:
-
JMX监控线程池
- 通过
jconsole或VisualVM连接Tomcat进程,查看Catalina:type=ThreadPoolMBean,监控Active Threads、Queue Size等指标。 - 配置建议:
maxThreads根据CPU核心数调整(I/O密集型可设为CPU核数×200),acceptCount避免队列积压。
- 通过
-
系统资源监控
- 使用
top -H -p查看线程CPU占用,定位高负载线程。 - 检查文件描述符限制:
ulimit -n,避免因连接数过多导致Too many open files错误。
- 使用
三、常见问题与解决方案
| 问题类型 | 典型日志特征 | 解决方案 |
|---|---|---|
| 线程死锁 | Found one Java-level deadlock |
用jstack分析锁持有链,按固定顺序加锁或使用tryLock超时机制。 |
| 线程池耗尽 | java.util.concurrent.RejectedExecutionException |
增加maxThreads,优化业务逻辑减少线程占用,或启用连接池动态扩容。 |
| 资源竞争 | 高频同步块日志或Lock contention |
使用ReentrantLock替代synchronized,或通过ReadWriteLock分离读写操作。 |
| 内存泄漏 | OutOfMemoryError: Java heap space |
生成堆转储(jmap -dump),用MAT分析未释放对象,重点检查静态集合或数据库连接未关闭问题。 |
四、预防措施
- 合理配置线程池:根据业务类型(CPU/I/O密集型)设置
maxThreads,避免过度放大线程数导致上下文切换开销。 - 代码优化:避免在Servlet中使用实例变量,使用
ThreadLocal存储线程隔离数据。 - 定期巡检:通过
cron定时执行jstack和jmap,监控线程状态和内存使用趋势。
参考来源:
以上就是关于“Ubuntu Tomcat日志中的线程问题诊断”的相关介绍,筋斗云是国内较早的云主机应用的服务商,拥有10余年行业经验,提供丰富的云服务器、租用服务器等相关产品服务。云服务器资源弹性伸缩,主机vCPU、内存性能强悍、超高I/O速度、故障秒级恢复;电子化备案,提交快速,专业团队7×24小时服务支持!
简单好用、高性价比云服务器租用链接:https://www.jindouyun.cn/product/cvm