【尊重原創文章出自:http://www.chepoo.com/java-jvm-command-tools.html】
一、概述 程序運行中經常會遇到各種問題,定位問題時通常需要綜合各種信息,如系統日志、堆dump文件、線程dump文件、GC日志等。通過虛擬機監控和診斷工具可以幫忙我們快速獲取、分析需要的數據,進而提高問題解決速度。 本文將介紹虛擬機常用監控和問題診斷命令工具的使用方法,主要包含以下工具: jps 顯示系統中所有Hotspot虛擬機進程 jstat 收集Hotspot虛擬機各方面運行數據 jstack 顯示虛擬機的線程棧信息 jinfo 顯示虛擬機的配置信息 jmap 用于生成虛擬機的內存快照信息
以上工具的官方文檔地址: http://docs.Oracle.com/javase/1.5.0/docs/tooldocs/ 圖形化工具如jconsole,jvisualvm將另文介紹。
二、工具介紹 1. jps JVM PRocess Status Tool,該命令用于列出正在運行的虛擬機進程,顯示main類的名稱和虛擬機進程id。該命令受當前用戶的訪問權限影響,比如linux下非root用戶只列出當前用戶啟動的虛擬機進程。
命令格式: jps [options] [hostid]
執行示例:
1234  | $ jps -l 3733 sun.tools.jps.Jps 3700 com.leanworld.JVMTools com.leanworld.JVMTools即為上面的示例代碼執行類。 | 
常用參數: -l 輸出主類全名 -v 輸出虛擬機進程啟動的jvm參數 -m 輸出啟動時傳遞給main函數的參數
2. jstat JVM Statistics Monitoring Tool,用于監控各種運行狀態信息的命令。在只有文本控制臺的環境中(如企業中的生產環境),該工具非常有用。 可以用來顯示系統中類裝載、垃圾回收、運行期編譯狀況等運行數據。
命令格式: jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ] vmid表示虛擬機唯一標識符,如果是本地虛擬機進程,與LVMID一致,通常為本地虛擬機進程號。 interval表示查詢間隔時間,count表示查詢次數。如果省略interval和count參數,表示查詢一次。
執行示例:
123456  | $ jstat -gcutil 3700 500 4   S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   50.00   0.00  60.78   0.50  12.76    214    0.049     0    0.000    0.049   0.00  25.00  20.27   0.50  12.76    215    0.049     0    0.000    0.049   0.00  25.00  70.91   0.50  12.76    215    0.049     0    0.000    0.049 50.00   0.00  20.27   0.50  12.76    216    0.049     0    0.000    0.049 | 
S0和S1表示Survivor0和Survivor1,E表示新生代Eden,O表示老年代Old,P表示持久代Permanent,以上各參數值表示已使用空間占比。 YGC表示young gc次數,YGCT表示young gc總耗時。FGC表示Full gc次數,FGCT表示full gc總耗時。GCT表示所有gc總耗時時間。
常用參數: class 類裝載相關信息. compiler JIT編譯器編譯過的方法、耗時等. gc java堆信息和垃圾回收狀況. gccapacity 關注java堆各個區的最大和最小空間. gccause 類似gcutil,額外輸出導致上一次gc的原因. gcnew 新生代gc狀況. gcnewcapacity 關注新生代gc使用的最大和最小空間. gcold 老年代gc狀況. gcoldcapacity 關注老年代gc使用的最大和最小空間. gcpermcapacity 關注持久代gc使用的最大和最小空間. gcutil 關注已使用空間占總空間比例. printcompilation 輸出已經被JIT編譯的方法.
3. jstack Stack Trace for Java,用于生成虛擬機當前的線程快照信息,包含每一條線程的堆棧信息。該命令通常用于定位線程停頓原因,當出現線程停頓時,可通過stack查看每個線程的堆棧信息,進而分析停頓原因。 命令格式: jstack [ option ] pid
執行示例:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556  | $ jstack 3700 2012-01-30 16:36:05 Full thread dump Java HotSpot(TM) Server VM (17.0-b16 mixed mode):  "Attach Listener" daemon prio=10 tid=0xaca16c00 nid=0x1384 waiting on condition [0x00000000]    java.lang.Thread.State: RUNNABLE  "Low Memory Detector" daemon prio=10 tid=0xaca00c00 nid=0x1366 runnable [0x00000000]    java.lang.Thread.State: RUNNABLE  "CompilerThread1" daemon prio=10 tid=0x08e58800 nid=0x1365 waiting on condition [0x00000000]    java.lang.Thread.State: RUNNABLE  "CompilerThread0" daemon prio=10 tid=0x08e56800 nid=0x1364 waiting on condition [0x00000000]    java.lang.Thread.State: RUNNABLE  "Signal Dispatcher" daemon prio=10 tid=0x08e54c00 nid=0x1363 runnable [0x00000000]    java.lang.Thread.State: RUNNABLE  "Finalizer" daemon prio=10 tid=0x08e39000 nid=0x1361 in Object.wait() [0xac943000]    java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0xb10e0230> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118) - locked <0xb10e0230> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)  "Reference Handler" daemon prio=10 tid=0x08e34400 nid=0x1360 in Object.wait() [0xacb94000]    java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0xb10e30d0> (a java.lang.ref.Reference$Lock) at java.lang.Object.wait(Object.java:485) at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116) - locked <0xb10e30d0> (a java.lang.ref.Reference$Lock)  "main" prio=10 tid=0x08d7bc00 nid=0x135a waiting on condition [0xb6a8a000]    java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at com.leanworld.JVMTools.createList(JVMTools.java:23) at com.leanworld.JVMTools.main(JVMTools.java:29)  "VM Thread" prio=10 tid=0x08e31c00 nid=0x135f runnable  "GC task thread#0 (ParallelGC)" prio=10 tid=0x08d83800 nid |