创建SpringBoot Web应用,访问/test/t1
会死循环
访问/test/t2
会死锁
访问两次/test/t1
,一次/test/t2
。
此时使用top
命令看一下进程
可以看到进程5510
占用大量CPU
。
此时看看进程5510里面是哪个线程导致这种结果
top -p 5510 -H
可以看到是线程5562
和5563
占用大量CPU,转化为16进制,方便带回查询堆栈定位。
接下来打印出该进程的堆栈信息
jstack 5510 > info.txt
此时进程5510
的堆栈信息已经保存在info.txt
中,vim查看,然后定位线程15bb
和线程15ba
的堆栈信息。
可以看到线程运行在17行的位置,看一下代码17行。
可以看到17行确实是死循环的位置。
在上述打印出堆栈信息到info.txt
后,在信息的最后可以看到死锁信息
查看代码41行和33行
找到线程死锁位置。