java專案cpu或記憶體過高,排查問題思路

东方欲晓_莫道君行早發表於2024-04-01

一、cpu過高

1、透過top命令,定位程序ID

透過top命令,檢視CPU使用率最高得程序ID,記為@pid

2、透過韓引數得top檢視cpu過高執行緒

命令 top -H -p [@pid],記錄結果得pid值,記為@tpid

3、透過printf 列印上述值得十六進位制

命令 printf 'ox%x\n' [@tpid],記錄結果為@tid

4、jstack命令檢視線性具體資訊

命令jstack [@pid] | grep [@tid] ,可以檢視執行緒具體資訊,再進行詳細定位

二、記憶體過高

1、top檢視較高得程序

top命令可以檢視cpu,記憶體等資訊,記錄程序ID為@pid

2、jstat檢視垃圾回收情況

命令jstat -gc [@pid] 1000 檢視GC情況,1000表示1秒重新整理一次

S0C:第一個倖存區的大小,單位KB。
S1C:第二個倖存區的大小。
S0U:第一個倖存區的使用大小。
S1U:第二個倖存區的使用大小。
EC:伊甸園區的大小。
EU:伊甸園區的使用大小。
OC:老年代大小。
OU:老年代使用大小。
MC:方法區大小(元空間)。
MU:方法區使用大小。
CCSC:壓縮類空間大小。
CCSU:壓縮類空間使用大小。
YGC:年輕代垃圾回收次數。
YGCT:年輕代垃圾回收消耗時間,單位s。
FGC:老年代垃圾回收次數。
FGCT:老年代垃圾回收消耗時間,單位s。
GCT:垃圾回收消耗總時間,單位s。

如果gc頻繁,每次回收記憶體空間也正常,那麼說明是因為物件建立過快導致記憶體一直佔用很高;如果每次回收的記憶體非常少,那麼有可能是因為記憶體洩漏導致記憶體一直無法被回收。

3、jmap檢視物件佔用記憶體情況

命令jmap -histo [@pid] | head 20檢視前20個大物件

4、jmap到處dump檔案

如果第三步查不出來,可以將dump檔案匯出,並透過visualVM 工具開啟分析,命令 jmap -dump:live,file=/home/my.hprof匯出dump檔案

歡迎大家留言,以便於後面的人更快解決問題!另外亦歡迎大家可以關注我的微信公眾號,方便利用零碎時間互相交流。共勉!

相關文章