JVM線程、內存問題排查

一、高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)檢查jvmgc情況

3) 找出佔用量比較大的對象

工具

jmap + jstat + mat

步驟:

 1、查看jvm內存分配及使用情況,執行命令 jmap heap 加任意進程id (目的是確定內存分配是否正確,以及jvm中內存的實時狀態)   


2、執行jstat -gcutil +進程id 1000 命令(1000m打印一次gc情況),檢查jvmgc情況


3、執行 jmap -histo:live +進程id|more 命令,找出堆中佔用量比較大的存活的對象

注意:一般不通過直接採用jmap dump 命令導出系統日誌,因爲dump操作長時間,很耗cpu資源,一般建議通過 jvm參數配置,在發生oom時,自動dump生成系統jvm快照文件,然後結合mat工具進行分析。

-XX:+HeapDumpOnOutOfMemoryError #生成堆文件地址:-XX:HeapDumpPath=/home/liuke/jvmlogs/  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章