1. 程式人生 > 其它 >使用JDK自帶工具調優JVM的常用命令

使用JDK自帶工具調優JVM的常用命令

使用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使用率猛增問題

  1. 使用top檢視java程序的pid
top -p pid
  1. 在top介面按H,獲取佔用CPU最高的執行緒ID,將執行緒ID轉16進位制。
  2. 使用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

參考資料