天天看點

定位CPU高問題

一、使用top和jstack

1.找到CPU最高的程序

指令:top

2.檢視最高程序的線程資訊,找到CPU占用最高的線程

指令:top -Hp 程序ID

3.轉換線程ID為16進制

printf %x 線程ID

4.dump

jstack 進制ID >1.txt

5.檢視dump檔案的線程相關資訊

cat 1.txt |grep -A 30 16進制線程ID

二、使用JMC

JMC->MBean伺服器->線程子頁面->cpu概要分析

優點:簡單

缺點:需要伺服器開始jmx

三、可能導緻CPU高的場景

1.無限while循環

盡量避免無限循環

讓循環執行得慢一點,比如加sleep

2.頻繁GC

降低GC頻率

3.頻繁建立新對象

合理使用單例

4.序列化和反序列化(有些性能差的古老的類庫)

5.正規表達式(發生回溯時)

減少回溯發生

回溯問題參考:https://blog.csdn.net/ityouknow/article/details/80851338

6.線程上下文頻繁切換

四、緊急處理原則

問題發生後,第一時間是快速保留問題現場供後面排查定位,然後盡快恢複服務。保留現場的具體操作:

列印堆棧資訊,指令行:jstat -l ‘java程序PID’

列印 jstack  39888 >jstack.dump

列印記憶體鏡像,指令行:jmap -dump:format=b,file=hprof ‘java程序PID’

生成core檔案,指令行:gcore ‘java程序PID’

保留gc日志檔案

保留業務日志檔案

檢視JAVA堆記憶體運作配置設定:指令行:jstat -gcutil ‘java程序PID’ 1000

完成以上操作後,盡快重新開機JAVA程序或復原,恢複服務。

繼續閱讀