基於Sun HotSpot JVM java
這裏將介紹幾款sun hotspot jvm 自帶的監控工具:c++
請確保java_home/bin配置到path環境變量下,由於這些工具都在jdk的bin目錄下app
jps(JVM Process Status Tool):JVM機進程情況工具框架
用來查看基於HotSpot JVM裏面全部進程的具體狀態, 包括進程ID,進程啓動的路徑等等。與unix上的ps相似,用來顯示本地有權限的java進程,能夠查看本地運行着幾個java程序,並顯示他們的進程號。使用jps時,不須要傳遞進程號作爲參數。
Jps也能夠顯示遠程系統上的JAVA進程,這須要遠程服務上開啓了jstat服務,以及RMI注及服務,不過經常使用都是對本對的JAVA進程的查看。
命令格式:jps [ options ] [ hostid ]
經常使用參數說明:
-m 輸出傳遞給main方法的參數,若是是內嵌的JVM則輸出爲null。
-l 輸出應用程序主類的完整包名,或者是應用程序JAR文件的完整路徑。
-v 輸出傳給JVM的參數。eclipse
例如:jvm
- C:\Users\Administrator>jps -lmv
- 1796 -Dosgi.requiredJavaVersion=1.5 -Xms40m -Xmx512m -XX:MaxPermSize=256m
- 7340 sun.tools.jps.Jps -lmv -Denv.class.path=.;D:\DevTools\VM\jdk1.6.0_31\\lib\dt.jar;D:\DevTools\VM\jdk1.6.0_31\\lib\tools.jar; -Dapplication.home=D:\DevTools\VM\jdk1.6.0_31 -Xms8m
其中pid爲1796的是個人eclipse進程,pid爲7340的是jps命令自己的進程工具
jinfo(Configuration Info for Java):JVM配置信息工具性能
能夠輸出並修改運行時的java 進程的opts。用處比較簡單,用於輸出JAVA系統參數及命令行參數ui
命令格式:jinfo [ options ] [ pid ]spa
經常使用參數說明:
-flag 輸出,修改,JVM命令行參數
例如:
- C:\Users\Administrator>jinfo 1796
將會打印出不少jvm運行時參數信息,因爲比較長這裏再也不打印出來,能夠本身試試,內容一目瞭然
Jstack(Stack Trace for Java):JVM堆棧跟蹤工具
jstack用於打印出給定的java進程ID或core file或遠程調試服務的Java堆棧信息,若是是在64位機器上,須要指定選項"-J-d64「
命令格式:jstack [ option ] pid
經常使用參數說明:
-F 當’jstack [-l] pid’沒有相應的時候強制打印棧信息
-l 長列表. 打印關於鎖的附加信息,例如屬於java.util.concurrent的ownable synchronizers列表.
-m 打印java和native c/c++框架的全部棧信息.
-h | -help打印幫助信息
例如:
- C:\Users\Administrator>jstack 1796
- 2013-05-22 11:42:38
- Full thread dump Java HotSpot(TM) Client VM (20.6-b01 mixed mode):
-
- "Worker-30" prio=6 tid=0x06514c00 nid=0x1018 in Object.wait() [0x056af000]
- java.lang.Thread.State: TIMED_WAITING (on object monitor)
- at java.lang.Object.wait(Native Method)
- at org.eclipse.core.internal.jobs.WorkerPool.sleep(WorkerPool.java:188)
- - locked <0x1ad84a90> (a org.eclipse.core.internal.jobs.WorkerPool)
- at org.eclipse.core.internal.jobs.WorkerPool.startJob(WorkerPool.java:220)
- at org.eclipse.core.internal.jobs.Worker.run(Worker.java:50)
- ......
- ......
- ......
- ......
jstat(JVM statistics Monitoriing Tool):JVM統計信息監視工具
對Java應用程序的資源和性能進行實時的命令行的監控,包括了對Heap size和垃圾回收情況的監控
命令格式:jstat [ option pid [interval [ s | ms ] [count] ] ]
經常使用參數說明:
-gcutil 輸出已使用空間佔總空間的百分比
-gccapacity 輸出堆中各個區域使用到的最大和最小空間
例如:每隔1秒監控jvm內存一次,共監控5次
- C:\Users\Administrator>jstat -gccapacity 1796 1s 5
- NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC PGCMN PGCMX PGC PC YGC FGC
- 13632.0 174720.0 40896.0 4032.0 4032.0 32832.0 27328.0 349568.0 81684.0 81684.0 12288.0 262144.0 80640.0 80640.0 42 96
- 13632.0 174720.0 40896.0 4032.0 4032.0 32832.0 27328.0 349568.0 81684.0 81684.0 12288.0 262144.0 80640.0 80640.0 42 96
- 13632.0 174720.0 40896.0 4032.0 4032.0 32832.0 27328.0 349568.0 81684.0 81684.0 12288.0 262144.0 80640.0 80640.0 42 96
- 13632.0 174720.0 40896.0 4032.0 4032.0 32832.0 27328.0 349568.0 81684.0 81684.0 12288.0 262144.0 80640.0 80640.0 42 96
- 13632.0 174720.0 40896.0 4032.0 4032.0 32832.0 27328.0 349568.0 81684.0 81684.0 12288.0 262144.0 80640.0 80640.0 42 97
- C:\Users\Administrator>jstat -gcutil 1796 1s 5
- S0 S1 E O P YGC YGCT FGC FGCT GCT
- 0.00 0.00 0.52 53.35 99.77 42 0.513 99 38.119 38.632
- 0.00 0.00 0.52 53.35 99.77 42 0.513 99 38.119 38.632
- 0.00 0.00 0.52 53.35 99.77 42 0.513 99 38.119 38.632
- 0.00 0.00 0.52 53.35 99.77 42 0.513 99 38.119 38.632
- 0.00 0.00 0.52 53.35 99.77 42 0.513 99 38.119 38.632
一些術語的中文解釋:
S0C:年輕代中第一個survivor(倖存區)的容量 (字節)
S1C:年輕代中第二個survivor(倖存區)的容量 (字節)
S0U:年輕代中第一個survivor(倖存區)目前已使用空間 (字節)
S1U:年輕代中第二個survivor(倖存區)目前已使用空間 (字節)
EC:年輕代中Eden(伊甸園)的容量 (字節)
EU:年輕代中Eden(伊甸園)目前已使用空間 (字節)
OC:Old代的容量 (字節)
OU:Old代目前已使用空間 (字節)
PC:Perm(持久代)的容量 (字節)
PU:Perm(持久代)目前已使用空間 (字節)
YGC:從應用程序啓動到採樣時年輕代中gc次數
YGCT:從應用程序啓動到採樣時年輕代中gc所用時間(s)
FGC:從應用程序啓動到採樣時old代(全gc)gc次數
FGCT:從應用程序啓動到採樣時old代(全gc)gc所用時間(s)
GCT:從應用程序啓動到採樣時gc用的總時間(s)
NGCMN:年輕代(young)中初始化(最小)的大小 (字節)
NGCMX:年輕代(young)的最大容量 (字節)
NGC:年輕代(young)中當前的容量 (字節)
OGCMN:old代中初始化(最小)的大小 (字節)
OGCMX:old代的最大容量 (字節)
OGC:old代當前新生成的容量 (字節)
PGCMN:perm代中初始化(最小)的大小 (字節)
PGCMX:perm代的最大容量 (字節)
PGC:perm代當前新生成的容量 (字節)
S0:年輕代中第一個survivor(倖存區)已使用的佔當前容量百分比
S1:年輕代中第二個survivor(倖存區)已使用的佔當前容量百分比
E:年輕代中Eden(伊甸園)已使用的佔當前容量百分比
O:old代已使用的佔當前容量百分比
P:perm代已使用的佔當前容量百分比
S0CMX:年輕代中第一個survivor(倖存區)的最大容量 (字節)
S1CMX :年輕代中第二個survivor(倖存區)的最大容量 (字節)
ECMX:年輕代中Eden(伊甸園)的最大容量 (字節)
DSS:當前須要survivor(倖存區)的容量 (字節)(Eden區已滿)
TT: 持有次數限制
MTT : 最大持有次數限制
jmap( Memory Map for Java):JVM內存映像工具
打印出某個java進程(使用pid)內存內的全部‘對象’的狀況(如:產生那些對象,及其數量)
命令格式:jmap [ option ] pid
經常使用參數說明:
-dump:[live,]format=b,file=<filename> 使用二進制形式輸出jvm的heap內容到文件中, live子選項是可選的,假如指定live選項,那麼只輸出活的對象到文件.
-histo[:live] 打印每一個class的實例數目,內存佔用,類全名信息. VM的內部類名字開頭會加上前綴」*」. 若是live子參數加上後,只統計活的對象數量.
-F 強迫.在pid沒有相應的時候使用-dump或者-histo參數. 在這個模式下,live子參數無效.
例如:以二進制形式輸入當前堆內存映像到文件data.hprof中
- jmap -dump:live,format=b,file=data.hprof 1796
生成的文件可使用jhat工具進行分析,在OOM(內存溢出)時,分析大對象,很是有用
經過使用以下參數啓動JVM,也能夠獲取到dump文件:
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./java_pid<pid>.hprof
在jvm發生內存溢出時生成內存映像文件
jhat(JVM Heap Analysis Tool):JVM堆轉儲快照分析工具
用於對JAVA heap進行離線分析的工具,他能夠對不一樣虛擬機中導出的heap信息文件進行分析,如LINUX上導出的文件能夠拿到WINDOWS上進行分析,能夠查找諸如內存方面的問題。
命令格式:jhat dumpfile(jmap生成的文件)
例如:分析jmap導出的內存映像
執行成功後,訪問http://localhost:7000便可查看內存信息,
MAT(Memory Analyzer Tool):一個基於Eclipse的內存分析工具
官網: http://www.eclipse.org/mat/
update:http://download.eclipse.org/mat/1.2/update-site/
這是eclipse的一個插件,安裝後能夠打開xxx.hprof文件,進行分析,比jhat更方便使用,有些時候因爲線上xxx.hprof文件過大,直接使用jhat進行初步分析了,能夠的話拷貝到本地分析效果更佳。
圖形化監控工具:
在JDK安裝目錄bin下面有兩個可視化監控工具
1. JConsole(Java Monitoring and Management Console) 基於JMX的可視化管理工具。
2. VisualVM(All-in-one Java Troubleshooting Tool)隨JDK發佈的最強大的運行監視和故障處理程序。
推薦使用VisualVM,他有不少插件,能夠更方便的監控運行時JVM
原創文章,轉載請指明出處:http://aub.iteye.com/blog/1873224