使用JDK自帶工具調優JVM的常用命令
阿新 • • 發佈:2022-01-16
使用jdk自帶工具調優jvm的常用命令
前言
對於Java程序常見問題,可以通過JVM監控工具(比如Prometheus)、Arthas等,或者使用JDK自帶的工具。如果第三方監控工具線上沒有的話,對jdk自帶的工具就要多熟悉熟悉。
線上Java程序執行常見問題:
- 記憶體溢位,OutOfMemoryError
- CPU使用率猛增
- JVM引數調優
jmap用法
- 檢視java程序記憶體佔用情況。通過這個命令,可以看出哪些物件最消耗記憶體。輸出結果最後有
Total
統計結果。
jmap -histo pid
- 檢視堆記憶體佔用情況
jmap -heap pid
- 匯出dump記憶體溢位的檔案,並匯入到jvisualvm客戶端進行檢視。
jmap -dump:file=a.dump pid
# 或者設定JVM引數:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./a.dump
使用jstack排查java程序佔用CPU使用率猛增問題
- 使用top檢視java程序的pid
top -p pid
- 在top介面按
H
,獲取佔用CPU最高的執行緒ID,將執行緒ID轉16進位制。 - 使用jstack檢視該執行緒ID堆疊資訊
# 假設程序ID為7147,執行緒ID的十進位制為7163,十六進位制為1bfb
jstack 7147 | grep -A 10 -B 10 1bfb
jstat用法
- 垃圾回收統計
jstat -gc pid # S0C: 第一個survivor區的容量 # S1C: 第二個survivor區的容量 # S0U: 第一個survivor區已使用的容量 # S1U: 第二個survivor區已使用的容量 # EC: Eden區的容量 # EU: Eden區的使用量 # OC: Old區的容量 # OU: Old區的使用量 # MC: Metaspace的容量 # MU: Metaspace的使用量 # CCSC: 壓縮指標的容量 # CCSU: 壓縮指標的使用量 # YGC: YoungGC的次數 # YGCT: 本次YoungGC耗時 # FGC: Full GC的次數 # FGCT: 本次Full GC耗時 # GCT: 總的GC耗時
- 連續觀察gc情況
# 每隔1000ms列印一次,總共列印10次
jstat -gc pid 1000 10
- 堆記憶體情況
jstat -gccapacity pid
# NGCMN: 新生代最小容量
# NGCMX: 新生代最大容量
# NGC: 當前新生代容量
# S0C: 第一個Survivor區大小
# S1C: 第二個Survivor區大小
# EC: Eden區的大小
# OGCMN: 老年代最小容量
# OGCMX: 老年代最大容量
# OGC: 當前老年代大小
# OC: 當前老年區大小
# MCMN: 最小元資料容量
# MCMX: 最大元資料容量
# MC: 當前元資料空間大小
# CCSMN: 最小壓縮類空間大小
# CCSMX: 最大壓縮類空間大小
# CCSC: 當前壓縮類空間大小
# YGC: 年輕代gc次數
# FGC: 老年代GC次數
- 新生代gc統計
jstat -gcnew pid
- 新生代堆記憶體情況
jstat -gcnewcapacity pid
- 老年代gc統計
jstat -gcold pid
- 老年代堆記憶體情況
jstat -gcoldcapacity pid
- 元空間堆記憶體情況
jstat -gcmetacapacity pid
- 整體情況
jstat -gcutil pid
# S0: Survivor 1區的使用比例
# E: Eden區使用比例
# ...
使用jinfo檢視jvm引數
# 包含flags和sysprops的資訊
jinfo pid
# 只有自定義的jvm引數
jinfo -flags pid
# 只有系統引數
jinfo -sysprops pid
參考資料
- JVM調優工具錦囊
man jmap
man jstack
man jstat
man jinfo