一、使用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程序或復原,恢複服務。