可以分為如下步驟:
①通過 top 命令查看 CPU 情況,如果 CPU 比較高,則通過 top -Hp
找出 CPU 過高的線程之后,將其線程 id 轉換為十六進制的表現形式(printf "%x" <線程id>),然后在 jstack 日志中查看該線程主要在進行的工作(jstack -F -l
這里又分為兩種情況:
1: 如果是正常的用戶線程,則通過該線程的堆棧信息查看其具體是在哪處用戶代碼處運行比較消耗 CPU。
2: 如果該線程是 VM Thread(VM Thread 指的就是垃圾回收的線程,一般前面會有 nid=0x.......,這里 nid 的意思就是操作系統線程 id),則通過 jstat -gcutil
②如果通過 top 命令看到 CPU 並不高,並且系統內存占用率也比較低。此時就可以考慮是否是由於另外三種情況導致的問題。
具體的可以根據具體情況分析:
1: 如果是接口調用比較耗時,並且是不定時出現,則可以通過壓測的方式加大阻塞點出現的頻率,從而通過 jstack 查看堆棧信息,找到阻塞點。
2: 如果是某個功能突然出現停滯的狀況,這種情況也無法復現,此時可以通過多次導出 jstack 日志的方式對比哪些用戶線程是一直都處於等待狀態,這些線程就是可能存在問題的線程。
3: 如果通過 jstack 可以查看到死鎖狀態,則可以檢查產生死鎖的兩個線程的具體阻塞點,從而處理相應的問題。