转载自本人博客
原文地址:https://www.deanwangpro.com/2019/07/28/zombie-thread-trouble-shooting
这两天遇到一个服务假死的问题,具体现象就是服务不再接收任何请求,客户端会抛出Broken Pipe。
检查系统状态
执行top,发现CPU和内存占用都不高,但是通过命令
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
发现有大量的CLOSEWAIT端口占用,继续调用该服务的api,等待超时之后发现CLOSEWAIT的数量也没有上升,也就是说服务几乎完全僵死。
检查JVM情况
怀疑可能是线程有死锁,决定先dump一下线程情况,执行
jstack <pid> > /tmp/thread.hump
发现tomcat线程基本也正常,都是parking状态。
这就比较奇怪了,继续想是不是GC导致了STW,使用jstat
查看垃圾回收情况
app@server:/tmp$ jstat -gcutil 1 2000 10
S0 S1 E O M CCS