jvm在jdk的bin目錄下試下了不少監控分析jvm運行狀況的命令行工具,這些工具都很小,大多數都是jdk/lib/tools.jar類庫的薄封裝。java
jps:虛擬機進程狀態工具( JVM Process Status Tool)c++
jps命令格式:jps [options] [hostid]api
jps執行樣例:服務器
jps -q 只輸出本地虛擬機線程IDapp
C:\Users\Administrator>jps -q 5268 6052 1452
jps -m 輸出虛擬機進程啓動時傳遞給主類main()函數的參數。jvm
C:\Users\Administrator>jps -m 5268 PretenureSizeThresholdTest 6052 3404 Jps -m
jps -l 輸出主類的全名,若是進程執行的是jar包,輸出jar包路徑函數
C:\Users\Administrator>jps -l 5268 com.sean.esapi.client.PretenureSizeThresholdTest 6052 6476 sun.tools.jps.Jps
jps -v 輸出虛擬機啓動時jvm參數工具
C:\Users\Administrator>jps -v 6928 Jps -Denv.class.path=.;C:\Program Files\Java\jdk1.8.0_111\lib;C:\Program Files\Java\jdk1.8.0_111\lib\tools.jar -Dapplication.home=C:\Pr ogram Files\Java\jdk1.8.0_111 -Xms8m 5268 PretenureSizeThresholdTest -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8 -XX:+PrintGCDetails -XX:+UseSerialGC -XX:PretenureSi zeThreshold=3145728 -Dfile.encoding=UTF-8 6052 -Dosgi.requiredJavaVersion=1.7 -XX:+UseG1GC -XX:+UseStringDeduplication -Dosgi.requiredJavaVersion=1.7 -Xms256m -Xmx1024m
注意:若是須要查看其餘機器上的jvm進程,須要在待查看機器上啓動jstatd。默認狀況下, jstatd 開啓在 1099 端口上開啓 RMI 服務器。ui
jstat 用於監視虛擬機各類運行狀態信息的命令行工具(JVM Statistics Monitoring Tool)。spa
jstat 命令格式:jstat [ option vmid [interval [s|ms] [count]] ]
參數interval 和 count 表示查詢間隔和次數。若是省略這兩個參數表示只查詢一次。
jstat 執行樣例:
jstat -gc 6800 250 10(查詢進程6800的垃圾收集情況,每隔250毫秒查詢一次,一共查詢10次)
C:\Users\Administrator>jstat -gc 6800 250 10 S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT 1024.0 1024.0 0.0 32.0 8192.0 7260.5 10240.0 8791.4 4864.0 2664.9 512.0 287.5 4418 4.576 4418 19.624 24.200 1024.0 1024.0 0.0 0.0 8192.0 7260.5 10240.0 8791.4 4864.0 2664.9 512.0 287.5 4463 4.602 4463 19.874 24.476 1024.0 1024.0 0.0 32.0 8192.0 7260.5 10240.0 8791.4 4864.0 2664.9 512.0 287.5 4509 4.632 4509 20.063 24.694 1024.0 1024.0 0.0 32.0 8192.0 7260.5 10240.0 8791.4 4864.0 2664.9 512.0 287.5 4556 4.654 4556 20.243 24.898 1024.0 1024.0 0.0 32.0 8192.0 7260.5 10240.0 8791.4 4864.0 2664.9 512.0 287.5 4598 4.680 4598 20.445 25.124 1024.0 1024.0 0.0 0.0 8192.0 2048.0 10240.0 8791.4 4864.0 2664.9 512.0 287.5 4642 4.726 4641 20.602 25.329 1024.0 1024.0 0.0 32.0 8192.0 7260.5 10240.0 8791.4 4864.0 2664.9 512.0 287.5 4687 4.779 4687 20.776 25.555 1024.0 1024.0 0.0 32.0 8192.0 7260.5 10240.0 8791.4 4864.0 2664.9 512.0 287.5 4735 4.808 4735 20.971 25.779 1024.0 1024.0 0.0 0.0 8192.0 2048.0 10240.0 8791.4 4864.0 2664.9 512.0 287.5 4778 4.846 4778 21.152 25.998 1024.0 1024.0 0.0 32.0 8192.0 7260.5 10240.0 8791.4 4864.0 2664.9 512.0 287.5 4818 4.877 4818 21.336 26.213
S0C:第一個Survivor區空間大小。
S1C:第二個Survivor區空間大小。
S0U:第一個Survivor區已使用內存大小。
S1U:第二個Survivor區已使用內存大小。
EC:Eden區空間大小。
EU:Eden區已使用內存大小。
OC:老年代空間大小。
OU:老年代已使用內存大小。
MC:Metaspace區域空間大小。
MU:Metaspace區域已使用內存大小。
CCSC:壓縮類空間大小。
CCSU:壓縮類空間使用大小。
YGC:年輕代垃圾回收次數。
YGCT:年輕代垃圾回收耗時。
FGC:full gc垃圾回收次數。
FGCT:full gc垃圾回收耗時。
GCT:垃圾回收總耗時。
jstat -gcutil 6784(輸出各個區域使用空間站總空間百分比)
C:\Users\Administrator>jstat -gcutil 6784 S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 0.00 0.00 25.00 85.85 54.79 56.15 3379 3.341 3378 14.542 17.883
jstat監視選項衆多,這裏不一一列舉。
jinfo 命令格式
jinfo [ option ] pid
更名了能夠實時查詢和調整虛擬機參數。
-flag <name> :輸出虛擬機對應參數配置的參數值。
-flag [+|-]<name> :新增或失效虛擬機對應參數的參數值。
-flag <name>=<value> :配置虛擬機對應參數的參數值。
-flags :輸出虛擬機配置信息。
-sysprops :輸出虛擬機System.getProperties()的內容。
<no option> :輸出上面兩項的全部信息。
jmap (Memory Map for Java)命令用於生成堆轉儲快照(通常生成heapdump或dump文件)。jmap的做用不單單是爲了獲取dump文件,還能夠查詢finalize執行隊列、java堆和永久代的詳細信息。
命令格式:jamp [ option ] vmid
option:
-dump ->生成java堆轉儲快照。
-finalizerinfo ->顯示在F-Queue中等待finalizer線程執行finalize方法的對象。
-heap -> 顯示java堆詳細信息。
-histo ->顯示堆中對象統計信息。
-F -> 當虛擬機進程對-dump選項沒有響應時,可以使用這個選項強制生成快照。
如下例子,生成java堆轉儲快照,dump出進程9403的存活對象。
jmap -dump:live,format=b,file=kafka9403.dump 9403
生成kafka9403.dump文件。
jstack(Stack Trace for Java)命令用於生成虛擬機當前時刻的線程快照。線程快照就是當前虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的緣由,如線程間死鎖、死循環、請求外部資源致使長時間等待等都是致使線程長時間停頓的常見緣由。
命令格式:jstack [ option ] vmid
選項:
-F ->當正常輸出的請求不被響應時,強制輸出線程堆棧。
-l ->除堆棧外,顯示關於鎖的附加信息。
-m ->若是調用到本地方法的話,能夠顯示c/c++的堆棧。
JDK中提供Thread.getAllStackTraces()獲取全部線程StackTraceElement對象,能夠獲取線程狀態。
for (Map.Entry<Thread,StackTraceElement[]> stackTrace : Thread.getAllStackTraces().entrySet()) { Thread thread = stackTrace.getKey(); StackTraceElement[] stack = stackTrace.getValue(); if(thread.equals(Thread.currentThread())){ continue; } System.out.println("線程:"+thread.getName()); for (StackTraceElement stackTraceElement : stack) { System.out.println(stackTraceElement); } }
2.1 JConsole:java監視與管理控制檯
概述、內存監控、線程監控
2.2 VisualVM:多合一故障處理工具