第一步: 使用top -c 命令查看哪个进程占用cpu
这里看到占用cpu的进程为20067
第二步:使用top -H -p 20067(进程ID) 查看占用cpu的线程
第三步:把列表中的占用高的线程pid转化成16进制
$ printf "%x\n" 26493(线程ID)
第四步:利用jstack 命令搜索线程信息
$ jstack -l 20067(进程ID) > dump.txt
$ vim dump.txt
在vim 中搜索26493(线程ID)的十六进制数字
重点查这么几类情况:
1)wait on monitor entry: 被阻塞的,肯定有问题
2)runnable : 注意IO线程
3)in Object.wait(): 注意非线程池等待
最后注意看runnable的GC任务线程
附加:
Online Java Thread Dump Analyzer - 在线线程日志分析工具
http://spotify.github.io/threaddump-analyzer/#thread-0x00007fae98001800
"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007f2f2401d800 nid=0x6645 runnable
$ jstat -gcutil 91782 5s
查询Eden和Old是否始终都占满,是否频繁进行YGC,是否频繁FGC
https://blog.csdn.net/zouheliang/article/details/80537571