一、高CUP排查
排查思路
1)找出佔用高的進程
2)找出佔用高的線程
3)找出具體的代碼
工具
jstack + top 命令
排查步驟
1、找出佔用高的進程,執行“top -c”命令,顯示進程運行信息列表,鍵入大寫P,按CPU使用率降序排列
如上,找出了進程ID :63821 佔用CPU第一,爲2%。(這裏只是隨意找了臺測試機,2%的CPU佔用率實際情況基本可以忽略)。Top命令執行結果每個參數具體含義可參考博文:Top命令詳解
2、找出佔用高的線程,執行“top -Hp 加進程Id ” 命令,顯示出該進程下的線程列表,同樣鍵入大寫P後,按CPU使用率降序排列,找出CPU佔用最高的線程id,爲63864,佔用0.7%
3、找出線程對應的代碼
1)執行:printf "%x\n" 63864,得出該線程轉16進制值,(因爲jstack打印出的線程棧信息中線程id是通過16進制展示的 )
2)執行: jstack 63864|grep f978 -C4 --color,找到具體的代碼(因爲公司環境問題,無法查看,可經修改配置)
理論上輸出應如下:
二、Heap 排查
排查思路
1)檢查jvm內存的分配情況
2)檢查jvm的gc情況
3) 找出佔用量比較大的對象
工具
jmap + jstat + mat
步驟:
1、查看jvm內存分配及使用情況,執行命令 jmap –heap 加任意進程id (目的是確定內存分配是否正確,以及jvm中內存的實時狀態)
2、執行jstat -gcutil +進程id 1000 命令(1000m打印一次gc情況),檢查jvm的gc情況
3、執行 jmap -histo:live +進程id|more 命令,找出堆中佔用量比較大的存活的對象
注意:一般不通過直接採用jmap dump 命令導出系統日誌,因爲dump操作長時間,很耗cpu資源,一般建議通過 jvm參數配置,在發生oom時,自動dump生成系統jvm快照文件,然後結合mat工具進行分析。
-XX:+HeapDumpOnOutOfMemoryError #生成堆文件地址:-XX:HeapDumpPath=/home/liuke/jvmlogs/