以前遇到 tomcat 莫名奇妙的假死了,没有任何的响应,然后重启后又可以了,隔段时间又假死了。以前不懂的处理和排除原因,纠结的半死。无从入手,都想砸电脑,小伙伴们有遇到过,我遇到过 4 次。
其实 tomcat 假死引起的原因有很多,要具体分析一下和排查一下。
tomcat 假死有以下几种可能的原因:
redis 的连接池资源没释放掉(tcp 没释放掉,tcp 状态为 close_wait)
数据库连接池资源没释放掉(tcp 没释放掉,tcp 状态为 close_wait)
上传文件资源没关闭掉 (tcp 没释放掉,tcp 状态为 close_wait)
httpclient 请求没关闭掉 (tcp 没释放掉,tcp 状态为 close_wait)
线程死锁
线程被阻塞了,没继续往下执行
tomcat 的假死的原因有很多,很多是由于 tcp 没有释放掉。具体怎么排查原因,下面会介绍一下。
案例 1
顺便说我遇到的一个坑,我曾经部署专门做定时任务项目,这个是用 spring 的 quartz 做的。发现定时任务执行一段时间后,居然没响应了,tomcat 没挂掉,cpu 和内存也正常。就是定时任务不执行。查看了线程,也没有死锁。后面查了很久,居然 quartz 的定时任务调度居然开启的是单线程的。由于我其中一个定时任务要执行消息写入数据库,这个量非常大,而且服务器配置比较差,写入比较慢。所以导致这个任务要执行差不多 1 天,导致其他定时任务不执行,所以还以为 tomcat 挂掉了。所以有时候要排查线程数是否足够。
案例 2
当服务器挂掉的时候,查看一下日志看能不能查出问题。日志查看不出来的时候,查看运行时候 cpu 和内存的波动,如果 cpu 和内存波动很大,就去查看堆栈信息,看哪个线程占用的 cpu 和内存比较高。dump 线程信息,查看一下具体代码哪个位置引起的。
查看堆栈信息可以使用以下工具
jdk 自带的 console.exe (window)
jdk 自带的 jvisualvm.exe (window)
jstack(linux)
alibaba/arthas 阿里巴巴的插件,挺好用的,推荐使用,还可以反编译源码
首先查看 cpu 和内存
用 jvisualvm(也可以远程连接到 linux 上面,改天我写个文章)
如果是 linux 系统的话,可以用 top -c 查看 cpu 和内存
top -c
查看线程信息
linux
jstack java的进程id
如果要查看有没有线程死锁,你可以按照下面命令做
jstack java 的进程 id >1.txt
然后在 1.txt 文件查找一下有没有 DeadThread 关键词。没有就是没死锁
本文由 admin 创作,采用 知识共享署名4.0
国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:2022-08-09 21:07:47