這篇文章帶給大家的內容是關於Java進程CPU佔用率100%問題排查的方法,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
100%指的是佔據了CPU一個核心,兩個核心是200%,以此類推。
CPU佔用率及對應進程ID(pid)可以透過top指令確定,在top介面按 c (顯示完整的命令列參數),按 1 (顯示每個核心的統計資料)。 (建議:Java教學)
這個問題最常見的有以下幾種可能:
1、堆記憶體不足導致頻繁Full GC
可以透過兩個指令決定
sudo jmap -heap pid 查看堆記憶體的消耗量
sudo jstat -gc pid interval count 查看GC情況,範例:sudo jstat -gc 5746 3000 5 代表檢視5746進程的GC情況、每隔3000毫秒列印一次、總共列印5次。如果FGC/FGCT增長明顯,表示Full GC很頻繁。
後續處理:
如果情況緊急,那麼得馬上重啟Java應用程式不緊急的話需要獲取相關資訊用於分析為什麼堆記憶體被消耗完了,可能有記憶體洩漏問題,可以用1)sudo jmap -histo pid | head -n 20 查看Java對象的佔用統計信息,2)sudo jmap -dump:live,format=b,file=heap.bin pid 把堆轉儲導出到本地文件,可以用Eclipse MAT 工具分析記憶體洩漏
2、程式碼實作問題
想法:追蹤具體是哪個執行緒佔用了CPU,1)先查到本地系統CPU佔用率高的執行緒ID, 2)找到對應的Java執行緒及執行緒堆疊
top -H -p pid 查看某個行程裡面哪些執行緒佔用了CPU,把對應的執行緒ID拷貝下來,轉為十六進位【IDEA》 Tools》Groovy Console》println Long.toHexString(1234) 即可完成轉換】。
sudo jstack -l -F pid | less 取得Java執行緒堆疊,用十六進位的本地執行緒ID搜索,會在某一行的nid處找到對應的執行緒。查看Java執行緒堆疊,找到對應的Java類別及行號,然後閱讀程式碼尋找可能的問題原因。
jstack堆疊資訊裡tid/nid的說明
https://docs.oracle.com/javas...
The thread dump consists of the thread stack, including the thread state, for all Java threads in the virtual machine. The header line contains the following information about the thread: - Thread ID (tid), which is the address of a thread structure in memory. - ID of the native thread (nid).
# #
以上是Java進程CPU佔用率100%問題排查的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!