tomcat 假死原因

/ 0条评论 / 0 个点赞 / 1129人阅读

以前遇到 tomcat 莫名奇妙的假死了,没有任何的响应,然后重启后又可以了,隔段时间又假死了。以前不懂的处理和排除原因,纠结的半死。无从入手,都想砸电脑,小伙伴们有遇到过,我遇到过 4 次。

其实 tomcat 假死引起的原因有很多,要具体分析一下和排查一下。

tomcat 假死有以下几种可能的原因:

tomcat 的假死的原因有很多,很多是由于 tcp 没有释放掉。具体怎么排查原因,下面会介绍一下。

案例 1

顺便说我遇到的一个坑,我曾经部署专门做定时任务项目,这个是用 spring 的 quartz 做的。发现定时任务执行一段时间后,居然没响应了,tomcat 没挂掉,cpu 和内存也正常。就是定时任务不执行。查看了线程,也没有死锁。后面查了很久,居然 quartz 的定时任务调度居然开启的是单线程的。由于我其中一个定时任务要执行消息写入数据库,这个量非常大,而且服务器配置比较差,写入比较慢。所以导致这个任务要执行差不多 1 天,导致其他定时任务不执行,所以还以为 tomcat 挂掉了。所以有时候要排查线程数是否足够。

案例 2

当服务器挂掉的时候,查看一下日志看能不能查出问题。日志查看不出来的时候,查看运行时候 cpu 和内存的波动,如果 cpu 和内存波动很大,就去查看堆栈信息,看哪个线程占用的 cpu 和内存比较高。dump 线程信息,查看一下具体代码哪个位置引起的。

查看堆栈信息可以使用以下工具

首先查看 cpu 和内存

用 jvisualvm(也可以远程连接到 linux 上面,改天我写个文章)

/upload/article/png/520520_20220613134100.png

如果是 linux 系统的话,可以用 top -c 查看 cpu 和内存

top -c

/upload/article/png/520520_20220613134202.png

查看线程信息

linux

jstack java的进程id

如果要查看有没有线程死锁,你可以按照下面命令做

jstack java 的进程 id >1.txt

然后在 1.txt 文件查找一下有没有 DeadThread 关键词。没有就是没死锁