服務器CPU很高,頻繁FullGC排查小總結


可以分為如下步驟:
①通過 top 命令查看 CPU 情況,如果 CPU 比較高,則通過 top -Hp 命令查看當前進程的各個線程運行情況。
找出 CPU 過高的線程之后,將其線程 id 轉換為十六進制的表現形式(printf "%x" <線程id>),然后在 jstack 日志中查看該線程主要在進行的工作(jstack -F -l > /tmp/jstack.log)。

這里又分為兩種情況:
1: 如果是正常的用戶線程,則通過該線程的堆棧信息查看其具體是在哪處用戶代碼處運行比較消耗 CPU。

2: 如果該線程是 VM Thread(VM Thread 指的就是垃圾回收的線程,一般前面會有 nid=0x.......,這里 nid 的意思就是操作系統線程 id),則通過 jstat -gcutil 命令監控當前系統的 GC 狀況。然后通過 jmap dump:format=b,file= 導出系統當前的內存數據。導出之后將內存情況放到 Eclipse 的 Mat 工具中進行分析即可得出內存中主要是什么對象比較消耗內存,進而可以處理相關代碼。

②如果通過 top 命令看到 CPU 並不高,並且系統內存占用率也比較低。此時就可以考慮是否是由於另外三種情況導致的問題。
具體的可以根據具體情況分析:
1: 如果是接口調用比較耗時,並且是不定時出現,則可以通過壓測的方式加大阻塞點出現的頻率,從而通過 jstack 查看堆棧信息,找到阻塞點。

2: 如果是某個功能突然出現停滯的狀況,這種情況也無法復現,此時可以通過多次導出 jstack 日志的方式對比哪些用戶線程是一直都處於等待狀態,這些線程就是可能存在問題的線程。

3: 如果通過 jstack 可以查看到死鎖狀態,則可以檢查產生死鎖的兩個線程的具體阻塞點,從而處理相應的問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM