第一步: 使用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