JVM七:虛擬機器效能監控與故障處理工具
第一部分:JDK的命令列工具
需要特別說明的是,下面介紹的工具全部基於windows平臺下的JDK 1.6 Update 21,如果JDK版本,作業系統不同,工具所支援的功能可能會有較大差別。大部分工具在JDK1.5就以經提供。如果讀者是JDK1.5版本的,在程式啟動時請新增引數 “-Dcom.sun.management.jmxremote”開啟JMX管理功能,否則部分工具是基於JMX他們將無法使用,JDK1.6後是預設開啟定的。
一:Jps(虛擬機器程序狀況工具)
jps -q 只輸出LVMID,省略主類的名稱
jps -l 輸出LVMID與程序的路徑或者jar包
jps -m 輸出虛擬機器每個程序啟動時傳入的mian()函式的引數
jps -v 輸出虛擬機器每個程序啟動時JVM引數下面看具體執行情況
二:jstat 虛擬機器統計資訊監視工具
jstat(JVM Statistics Monitoring Tool)是用於監視虛擬機器各種執行狀態資訊的命令列工具。它可以顯示本地或者遠端虛擬機器程序的類裝載,記憶體,垃圾收集,JIT編譯等執行資料,以純文字顯示。它將是執行期定位虛擬機器效能問題的首選工具。
格式: jstat [option vmid [interval[s|ms] [count] ] ] option表示指令 vmid 表示程序號 interval表示間隔時間(預設毫秒
選項 | 作用 |
-class | 監視類轉載,解除安裝數量,總空間以及類轉載所耗費的時間 |
-gc | 監視Java堆狀況,包括Eden區,兩個survivor區,老年代,永久代等的容量,已用空間,GC時間合計等資訊 |
-gccapacity | 監視內容與-gv基本相同,但輸出主要關注Java堆各個區域使用到的最大,最小空間 |
-gcutil | 監視內容與-gv基本相同,但輸出主要關注已使用空間佔總空間的百分比 |
-gccause | 與gcutil功能一樣,但是會額外輸出導致上一次gc產生的原因 |
-gcnew | 監視新生代GC狀況 |
-gcnewcapacity | 監視內容與-gcnew基本相同,輸出關注使用的最大最小空間 |
-gcold | 監視老年代GC情況 |
-gccoldcapacity | 監視內容與gccold基本相同,輸出關注使用的最大最小空間 |
-gcpermcapacity | 輸出永久代使用到的最大,最小空間 |
-compiler | 輸出JIT編譯器編譯過的方法,耗時等資訊 |
-printcompilation | 輸出已經被JIT編譯的方法 |
下面看具體列子警告原因是在windows系統不相容,不影響
C:\Users\GH>jstat -class 2024
Loaded Bytes Unloaded Bytes Time
318 363.8 0 0.0 0.03
C:\Users\GH>jstat -gc 2024
Warning: Unresolved Symbol: sun.gc.metaspace.capacity substituted NaN
Warning: Unresolved Symbol: sun.gc.metaspace.used substituted NaN
Warning: Unresolved Symbol: sun.gc.compressedclassspace.capacity substituted NaN
Warning: Unresolved Symbol: sun.gc.compressedclassspace.used substituted NaN
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
64.0 64.0 0.0 0.0 896.0 502.9 4096.0 0.0 - - - - 0 0.000 0 0.000 0.000
C:\Users\GH>jstat -gcutil 2024
Warning: Unresolved Symbol: sun.gc.metaspace.capacity substituted NaN
Warning: Unresolved Symbol: sun.gc.metaspace.used substituted NaN
Warning: Unresolved Symbol: sun.gc.metaspace.capacity substituted NaN
Warning: Unresolved Symbol: sun.gc.compressedclassspace.capacity substituted NaN
Warning: Unresolved Symbol: sun.gc.compressedclassspace.used substituted NaN
Warning: Unresolved Symbol: sun.gc.compressedclassspace.capacity substituted NaN
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 56.13 0.00 - - 0 0.000 0 0.000 0.000
C:\Users\GH>
三:jinfo:Java配置資訊工具
jinfo(Configure Info For Java)的作用是實時檢視和調整虛擬機器各項引數。這個工具只有在jdk1.6的工具才會有作用。使用jps命令的-v引數可以檢視虛擬機器啟動時顯式指定的引數列表,但如果想知道未被顯式指定的引數的系統預設值,除了找資料外,就只能使用jinfo的-flag選項進行查詢了。
格式 jinfo [option] pid option引數為JVM配置引數
四:jmap:Java記憶體映像工具
jmap(Memory Map for Java)命令用於生成堆轉儲快照(一般稱為headdump或dump檔案)。還可以查詢finalize執行佇列,Java堆和永久代的詳細資訊,如空間使用率、當前用的是哪種收集器等。
jmap格式 jmap [option] vmid
jmap的選項:
-dump 生成Java堆轉儲快照。格式為:-dump:[live, ] format=b, file=<filename>, 其中live子引數說明是否只dump出存活的物件。
-finalizerinfo 顯示在F-Queue中等待Finalizer執行緒執行finalize方法的物件。只在Linux/Solaris平臺下有效
-heap 顯示Java堆詳細資訊,如使用哪種回收器、引數配置、分代狀況等。只在Linux/Solaris平臺下有效
-histo 顯示堆中物件統計資訊,包括類、實力數量、合計容量
-permstat 以ClassLoader為統計口徑顯示永久代記憶體狀態。只在Linux/Solaris平臺下有效
-F 當虛擬機器程序對-dump選項沒有響應時,可使用這個選項強制生成dump快照,只在Linux/Solaris平臺下有效
五:jhat:虛擬機器堆轉儲快照分析工具
jhat(JVM Heap Analysis Tool)與jmap搭配使用,分析jmap生成的堆轉儲快照。jhat內建了一個微型的HTTP/HTML伺服器,生成dump檔案的分析結果後,可以在瀏覽器中檢視。不過在實際中不使用jhat來分析dump,主要原因:1.一般不在部署應用的伺服器上直接分析dump檔案,而要複製到其他機器上進行分析,因為是耗時且消耗硬體資源。2.jhat功能比較簡陋,如VisualVM,Eclipse Momery Analyzer、IBM HeapAnalyzer等都更強大。
六: jstack:Java堆疊跟蹤工具
jstack(Stack Trace for Java)命令用於生成虛擬機器當前時刻的執行緒快照(一般稱為threaddump或者javacore檔案)。執行緒快照就是當前虛擬機器內每一條執行緒正在執行的方法堆疊的集合,生成執行緒快照的主要目的是定位執行緒出現長時間停頓的原因,如執行緒間死鎖、死迴圈、請求外部資源導致的長時間等待等都是導致執行緒長時間停頓的常見原因。執行緒出現停頓的時候通過jstack來檢視各個執行緒的呼叫堆疊,就可以知道沒有響應的執行緒到底在後臺做些什麼事情,或者等待什麼資源。
第二部分:JDK視覺化工具
一:Jconsole:Java監視與管理控制檯
Jconsole(Java Monitoring and Management Console)是一種基於JMX的視覺化監視、管理工具。
二:VisualVM:多合一故障處理工具
VisualVM(All-in-One Java Troubleshooting Tool)是到目前為止隨JDK釋出的功能最強大的執行監視和故障處理工具。