参考:
https://blog.csdn.net/yunzhonghefei/article/details/89207243
https://blog.csdn.net/u013467442/article/details/88957485
1、jstack需要使用与进程一致的用户才能执行
2、查看CPU占用率高的进程:top
cpu高达100.0us , 确定 pid 为 110199 的进程导致。
3、查看进程下占用CPU较高的线程:ps p 进程号 -L -o pcpu,pid,tid,time
ps p 110199 -L -o pcpu,pid,tid,time
%CPU PID TID TIME
18.7 110199 42096 14:42:30
41.7 110199 66438 14:39:08
41.8 110199 66440 14:39:55
42.8 110199 66491 14:38:57
41.3 110199 66515 14:27:08
41.3 110199 66611 14:23:05
41.3 110199 66612 14:22:59
41.5 110199 66638 14:24:53
41.3 110199 66639 14:21:53
37.6 110199 67920 12:12:33
比如最高的一组 %CPU占42.8 PID为110199 TID为66491 产生时间为14:38:57
4、将获取的线程号(十进制数)转换成十六进制
printf "%x\n" 66491
结果:103bb
5、结合进程号和线程号,利用jstack查到异常代码所在行:jstack -l 进程号 | grep 十六进制的线程号 -A 10
jstack -l 110199 | grep 0x103bb -A 10
结果:
[irfs@localhost bin]$ ./jstack -l 110199| grep 0x103bb -A 10
"http-nio-8082-exec-17" #2471 daemon prio=5 os_prio=0 tid=0x00007f3d3400f800 nid=0x103bb runnable [0x00007f3ef1547000]
java.lang.Thread.State: RUNNABLE
at java.util.regex.Pattern$Curly.match1(Pattern.java:4300)
at java.util.regex.Pattern$Curly.match(Pattern.java:4236)
at java.util.regex.Pattern$Slice.match(Pattern.java:3972)
at java.util.regex.Pattern$Start.match(Pattern.java:3461)
at java.util.regex.Matcher.search(Matcher.java:1248)
at java.util.regex.Matcher.find(Matcher.java:637)
at xx.ExcelToHtml.convert(ExcelToHtml.java:126)
at sun.reflect.GeneratedMethodAccessor186.invoke(Unknown Source)
[irfs@localhost bin]$
定位到ExcelToHtml.java:126 有死循环导致。