1. 程式人生 > 其它 >Java線上排查

Java線上排查

技術標籤:線上排查堆疊javajvm記憶體洩漏多執行緒

CPU

1.top看一下那些程序佔用比較高
2.top -H -p pid(程序號),找到佔用比較高的執行緒
3.將佔用最高的pid轉換為16進位制printf ‘%x\n’ pid得到nid
4.列印堆疊資訊jstack pid >> jstack.log
5.開啟日誌搜尋nid
對jstack檔案進行分析,通常我們會比較關注WAITING、TIMED_WAITING和BLOCKED的部分。我們可以使用命令cat jstack.log | grep “java.lang.Thread.State” | sort -nr | uniq -c來對jstack的狀態有一個整體的把握,如果WAITING之類的特別多,那麼多半是有問題

在這裡插入圖片描述

磁碟

df -h檢視磁碟空間
在這裡插入圖片描述
lsof -p pid檢視檔案讀寫情況

記憶體

free -h檢視記憶體使用情況
在這裡插入圖片描述
OOM

Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread

這個意思是沒有足夠的記憶體空間給執行緒分配java棧,基本上還是執行緒池程式碼寫的有問題,比如說忘記shutdown,所以說應該首先從程式碼層面來尋找問題,使用jstack或者jmap
另外也可以在系統層面,可以通過修改/etc/security/limits.confnofile和nproc來增大os對執行緒的限制

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

這個意思是堆的記憶體佔用已經達到-Xmx設定的最大值,應該是最常見的OOM錯誤了。解決思路仍然是先應該在程式碼中找,懷疑存在記憶體洩漏,通過jstack和jmap去定位問題。如果說一切都正常,才需要通過調整Xmx的值來擴大記憶體

Caused by: java.lang.OutOfMemoryError: Meta space

這個意思是元資料區的記憶體佔用已經達到XX:MaxMetaspaceSize設定的最大值,排查思路和上面的一致,引數方面可以通過XX:MaxPermSize來進行調整(1.8以前叫永久代,無元資料區)

Stack Overflow

Exception in thread "main" java.lang.StackOverflowError

棧記憶體溢位,表示執行緒棧需要的記憶體大於Xss值,同樣也是先進行排查,引數方面通過Xss來調整,但調整的太大可能又會引起OOM。

垃圾回收

確定下gc是不是太頻繁,使用jstat -gc pid 1000命令來對gc分代變化情況進行觀察,1000表示取樣間隔(ms)
S0C、S1C、S0U、S1U:Survivor 0/1區容量(Capacity)和使用量(Used)
EC、EU:Eden區容量和使用量
OC、OU:年老代容量和使用量
MC、MU:元資料區容量和使用量
CCSC、CCSU:壓縮類空間容量和使用量
YGC、YGT:年輕代GC次數和GC耗時
FGC、FGCT:Full GC次數和Full GC耗時
GCT:GC總耗時在這裡插入圖片描述