JVM命令行性能監控工具

基於jdk1.8

1、在 java 的 bin 目錄下,jdk 提供了很多使用的工具,下面學習一些監控和故障處理的工具。

名稱 作用
jps JVM process status tool,顯示指定系統內所有的 HotSpot 虛擬機進程
jstat JVM statistics monitoring tool,用於收集 HotSpot 虛擬機各方面的運行數據
jinfo 顯示虛擬機配置信息
jmap 生產虛擬機的內存快照 dump 文件
jhat 分析 dump 文件
jstack 顯示虛擬機的線程快照

2、jps 虛擬機進程狀況工具

2.1、jps 的命令格式:

jps [options] [hostid]
jps 可以查看通過 rmi 協議查詢開啓了 rmi 服務的原創虛擬機進程狀態,hostid 是 rmi 註冊表中註冊的主機。

# jps -l
5289 org.apache.catalina.startup.Bootstrap
5385 sun.tools.jps.Jps
2.2、jps 有如下主要的選項:
選項 作用
-q 只輸出 LVMID,省略主類的名稱
-m 輸出虛擬機啓動時候傳遞給 main 方法的參數
-l 輸出類的全名
-v 輸出虛擬機進程啓動時 JVM 參數
-V 禁止輸出傳遞給main方法的類名、JAR文件名和參數,只生成本地JVM標識符列表。
-Joption 將選項傳遞給JVM,其中option是Java應用程序啓動程序引用頁中描述的選項之一。例如,-J-Xms48m將啓動內存設置爲48 MB。

3、jstat 虛擬機統計信息監視工具

3.1、jstat 可以顯示本地或者遠程虛擬機進程中的類裝載、內存、垃圾收集、 JIT 編譯等運行數據。

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html#BEHIGDGJ
jstat 的命令格式:
jstat [ generalOption | outputOptions vmid [ interval[s|ms] [ count ] ]

generalOption
單個常規命令行選項-help或-options。請參見常規選項。

outputOptions
一個或多個輸出選項,包括單個statOption,以及-t、-h和-J選項中的任何一個。請參見輸出選項。

vmid
虛擬機標識符,它是指示目標JVM的字符串。一般語法如下:
[protocol:][//]lvmid[@hostname[:port]/servername]
vmid字符串的語法對應於URI的語法。vmid字符串可以是表示本地JVM的簡單整數,也可以是指定通信協議、端口號和其他特定於實現的值的更復雜的構造。請參閱虛擬機標識符。

interval [s|ms]
以指定單位(秒或毫秒)表示的採樣間隔。默認單位爲毫秒。必須是正整數。指定時,jstat命令在每個間隔生成其輸出。

count
要顯示的樣本數。默認值是無窮大,這會導致jstat命令顯示統計信息,直到目標JVM終止或jstat命令終止。此值必須爲正整數。

例如:查詢 5289進程的虛擬機狀況,並且每隔 1000 毫秒一次,顯示 5 次。

# jstat -gcutil 5289 1000 5
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00  99.77  30.24  21.96  96.92  94.88      3    0.079     0    0.000    0.079
  0.00  99.77  30.24  21.96  96.92  94.88      3    0.079     0    0.000    0.079
  0.00  99.77  30.24  21.96  96.92  94.88      3    0.079     0    0.000    0.079
  0.00  99.77  30.24  21.96  96.92  94.88      3    0.079     0    0.000    0.079
  0.00  99.77  30.24  21.96  96.92  94.88      3    0.079     0    0.000    0.079

注意:不要編寫腳本來解析jstat命令的輸出,因爲在將來的版本中格式可能會改變。如果您編寫了解析jstat命令輸出的腳本,那麼希望在該工具的未來版本中修改它們。

3.2、統計選項
選項 作用
class 顯示有關類加載器行爲的統計信息。
compiler 顯示有關Java熱點虛擬機實時編譯器行爲的統計信息。
gc 顯示有關垃圾收集堆行爲的統計信息。
gccapacity 顯示有關各代及其相應空間的容量的統計信息。
gccause 顯示有關垃圾收集統計信息的摘要(與-gcutil相同),其中包含上次和當前(如果適用)垃圾收集事件的原因。
gcnew 顯示新生代行爲的統計信息。
gcnewcapacity 顯示有關新生代及其相應空間大小的統計信息。
gcold 顯示有關舊生代行爲的統計信息和元空間統計信息。
gcoldcapacity 顯示有關舊生代大小的統計信息。
gcmetacapacity 顯示有關元空間大小的統計信息。
gcutil 顯示有關垃圾收集統計信息的摘要。
printcompilation 顯示Java熱點虛擬機編譯方法統計信息。
3.3、輸出列

-class option
類裝入器統計信息。
Loaded:已加載的類數。
Bytes:加載的kBs數。
Unloaded:已卸載的類數。
Bytes:卸載的字節數。
Time:執行類加載和卸載操作所花費的時間。

-compiler option
Java熱點虛擬機實時編譯器統計信息。
Compiled:執行的編譯任務數。
Failed:失敗的編譯任務數。
Invalid:無效的編譯任務數。
Time:執行編譯任務所花費的時間。
FailedType:上次編譯失敗的編譯類型。
FailedMethod:上次編譯失敗的類名和方法。

-gc option
垃圾收集堆統計信息。
S0C:當前survivor 0容量(kB)。
S1C:當前survivor 1容量(kB)。
S0U:survivor 0利用率(kB)。
S1U:survivor 1利用率(kB)。
EC:當前eden空間容量(kB)。
EU:eden空間利用率(kB)。
OC:當前老年代空間容量(kB)。
OU:老年代利用率(kB)。
MC:元空間容量(kB)。
MU:元空間利用率(kB)。
CCSC:壓縮類空間容量(kB)。
CCSU:使用的壓縮類空間(kB)。
YGC:年輕代垃圾收集事件數。
YGCT:年輕代垃圾收集時間。
FGC:Full GC事件數。
FGCT:Full GC時間。
GCT:垃圾收集總時間。

-gccapacity option
內存池生成和空間容量。
NGCMN:最小新生代容量(kB)。
NGCMX:最大新生代容量(kB)。
NGC:當前新生代容量(kB)。
S0C:當前survivor 0容量(kB)。
S1C:當前survivor 1容量(kB)。
EC:當前的eden空間容量(kB)。
OGCMN:最小老年代容量(kB)。
OGCMX:最大老年代容量(kB)。
OGC:當前老年代容量(kB)。OGC = sum(all OC)
OC:當前老年代容量(kB)。
MCMN:最小元空間容量(kB)。
MCMX:最大元空間容量(kB)。
MC:元空間容量(kB)。
CCSMN:壓縮類空間最小容量(kB)。
CCSMX:壓縮類空間最大容量(kB)。
CCSC:壓縮類空間容量(kB)。
YGC:年輕代GC事件的數量。
FGC: Full GC事件數。

-gccause option
此選項顯示與-gcutil選項相同的垃圾收集統計信息摘要,但包含上一個垃圾收集事件和(如果適用)當前垃圾收集事件的原因。除了爲-gcutil列出的列之外,此選項還添加以下列。
LGCC:上次垃圾收集的原因
GCC:當前垃圾收集的原因

-gcnew option
新一代統計數據。
S0C:當前survivor 0容量(kB)。
S1C:當前survivor 1容量(kB)。
S0U:survivor 0已使用空間(kB)。
S1U:survivor 1已使用空間(kB)。
TT:維持閾值。
MTT:最大壽命閾值。
DSS:所需倖存者大小(kB)。
EC:當前的eden空間容量(kB)。
EU:Eden已使用(kB)。
YGC:年輕代GC事件的數量。
YGCT: 年輕代垃圾收集時間。

-gcnewcapacity option
新一代空間大小統計。
NGCMN:最小新生代容量(kB)。
NGCMX:最大新生代容量(kB)。
NGC:當前新生代容量(kB)。
S0CMX:最大survivor 0容量(kB)。
S0C:當前survivor 0容量(kB)。
S1CMX:最大survivor 1容量(kB)。
S1C:當前survivor 1容量(kB)。
ECMX:最大eden空間容量(kB)。
EC:當前的eden空間容量(kB)。
YGC:年輕代GC事件的數量。
FGC:Full GC事件數。

-gcold option
舊代和元空間行爲統計。
MC:元空間容量(kB)。
MU:元空間利用率(kB)。
CCSC:壓縮類空間容量(kB)。
CCSU:使用的壓縮類空間(kB)。
OC:當前舊空間容量(kB)。
OU:舊空間利用率(kB)。
YGC:年輕代GC事件的數量。
FGC:Full GC事件數。
FGCT:Full GC時間。
GCT:垃圾收集總時間。

-gcoldcapacity option
舊一代規模統計。
OGCMN:最小老年代容量(kB)。
OGCMX:最大老年代容量(kB)。
OGC:當前老年代容量(kB)。
OC:當前舊空間容量(kB)。
YGC:年輕代GC事件的數量。
FGC:完整GC事件數。
FGCT:Full GC垃圾收集時間。
GCT:垃圾收集總時間。

-gcmetacapacity option
元空間大小統計。
MCMN:最小元空間容量(kB)。
MCMX:最大元空間容量(kB)。
MC:元空間容量(kB)。
CCSMN:壓縮類空間最小容量(kB)。
CCSMX:壓縮類空間最大容量(kB)。
YGC:年輕代GC事件的數量。
FGC:Full GC事件數。
FGCT:垃圾收集時間已滿。
GCT:垃圾收集總時間。

-gcutil option
垃圾收集統計的摘要。
S0:survivor 0的使用率佔當前容量的百分比。
S1:survivor 1的使用空間佔當前容量的百分比。
E: Eden空間使用空間佔當前容量的百分比。
O: 老年代使用空間佔當前容量的百分比。
M: 元空間利用率佔當前容量的百分比。
CCS:壓縮類空間已使用百分比。
YGC:年輕代GC事件的數量。
YGCT:年輕代垃圾收集時間。
FGC:Full GC事件數。
FGCT:Full GC收集時間。
GCT:垃圾收集總時間。

-printcompilation option
Java熱點虛擬機編譯器方法統計信息。
Compiled:由最近編譯的方法執行的編譯任務數。
Size:最近編譯的方法的字節碼字節數。
Type:最近編譯的方法的編譯類型。
Method:識別最近編譯的方法的類名和方法名。類名使用斜線(/)而不是點(.)作爲名稱空間分隔符。方法名是指定類中的方法。這兩個字段的格式與HotSpot-XX:+PrintCompilation選項一致。

4、jinfo 查看 java 配置信息工具

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jinfo.html#BCGEBFDD

jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [ servier-id ] remote-hostname-or-IP
選項
no-option
打印命令行標誌和系統屬性名稱-值對。
-flag name
打印指定命令行標誌的名稱和值。
-flag [+|-]name
啓用或禁用指定的布爾命令行標誌。
-flag name=value
將指定的命令行標誌設置爲指定值。
-flags
打印傳遞給JVM的命令行標誌。
-sysprops
將Java系統屬性打印爲名稱-值對。
-h
打印幫助消息。
-help
打印幫助消息。

5、jmap 生產 java 內存 dump

jmap 除了可以生成 dump 文件外,還可以查詢 finalize 執行隊列,java 堆和永久代的詳細信息,如空間使用率和當前用的是哪種收集器等。
具體的 jamp 如何操作部多介紹,看下面提供的說明,比較簡單:

jmap [ options ] pid
jmap [ options ] executable core
jmap [ options ] [ pid ] server-id@ ] remote-hostname-or-IP
選項
<no option>
如果沒有使用任何選項,jmap命令將打印共享對象映射。對於加載到目標JVM中的每個共享對象,將打印共享對象文件的起始地址、映射大小和完整路徑。此行爲類似於Oracle Solaris pmap實用程序。
-dump:[live,] format=b, file=filename
將hprof二進制格式的Java堆轉儲到文件名。live子選項是可選的,但是在指定時,只轉儲堆中的活動對象。要瀏覽堆轉儲,可以使用jhat(1)命令讀取生成的文件。
-finalizerinfo
打印有關等待完成的對象的信息。
-heap
打印所用垃圾收集、頭配置和按生成的堆使用情況的堆摘要。此外,還將打印實習字符串的數量和大小。
-histo[:live]
打印堆的直方圖。對於每個Java類,都會打印對象數、內存大小(字節)和完全限定的類名。JVM內部類名以星號(*)前綴打印。如果指定了活動子選項,則僅計算活動對象。
-clstats
打印Java堆的類裝入器統計信息。對於每個類裝入器,都會打印其名稱、活動程度、地址、父類裝入器以及已裝入的類的數量和大小。
-F
強制。當pid不響應時,將此選項與jmap-dump或jmap-histo選項一起使用。此模式不支持live子選項。
-h
打印幫助消息。
-help
打印幫助消息。
-Jflag
將標誌傳遞給運行jmap命令的Java虛擬機。

6、jhat 虛擬機堆快照分析工具

我們可以使用 jhat 來分析 jmap 生成的 dump 文件

#jhat tmp.dump
Reading from tmp.dump...
Dump file created Sat May 09 17:10:52 CST 2015
Snapshot read, resolving...
Resolving 0 objects...
WARNING:  hprof file does not include java.lang.Class!
WARNING:  hprof file does not include java.lang.String!
WARNING:  hprof file does not include java.lang.ClassLoader!
Chasing references, expect 0 dots
Eliminating duplicate references
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

默認會開 7000 端口進行 web 訪問。一般不使用這個命令來分析,會使用專業的工具來分析 dump 文件,如 eclipse memory analyzer 等。

7、jstack 分析 java 堆棧

jstack 用來生成當前時刻線程快照。

jstack [ options ] pid
jstack [ options ] executable core
jstack [ options ] [ server-id@ ] remote-hostname-or-IP
選項
-F
當jstack[-l]pid沒有響應時,強制棧轉儲。
-l
長列表。打印有關鎖的其他信息,例如擁有的java.util.concurrent ownable同步器的列表。請參閱位於的AbstractOwnableSynchronizer類描述
http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/AbstractOwnableSynchronizer.html
-m
打印一個混合模式堆棧跟蹤,既有java也有本地C/C++框架。
-h
打印幫助消息。
-help
打印幫助消息。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章