1. 程式人生 > >java虛擬機器記憶體監控工具jps,jinfo,Jstack,jstat,jmap,jhat使用

java虛擬機器記憶體監控工具jps,jinfo,Jstack,jstat,jmap,jhat使用

這裡將介紹幾款sun hotspot jvm 自帶的監控工具:

請確保java_home/bin配置到path環境變數下,因為這些工具都在jdk的bin目錄下

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的引數。

例如:

C:\Users\liu>jps -lmv
4868 -Dexe4j.semaphoreName=d:_program files (x86)_jetbrains_intellij idea 12.1.
7_bin_idea.exe -Dexe4j.moduleName=D:\Program Files (x86)\JetBrains\IntelliJ IDEA
12.1.7\bin\idea.exe -Dexe4j.processCommFile=C:\Users\liu\AppData\Local\Temp\e4j
_p4868.tmp -Dexe4j.tempDir=C:\Users\liu\AppData\Local\Temp\e4jBF67.tmp_dir -Dexe
4j.unextractedPosition=558234 -Djava.library.path=D:\Program Files (x86)\JetBrai
ns\IntelliJ IDEA 12.1.7\bin…\bin;C:\Program Files (x86)\Common Files\NetSara
ng;E:\project\arachne\web\trunk\muri_gm;E:\project\arachne\web\trunk\muri_im;C:\
Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\Windows
PowerShell\v1.0\;C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x86;C:\Program
Files (x86)\Intel\OpenCL SDK\2.0\bin\x64;D:\Program Files\Java\jdk1.7.0_07\bin;D
:\Program Files\Java\jdk1.7.0_07\jre\bin;D:\Program Files\apache-maven-3.0.4-bin
\apache-maven-3.0.4\bin;E:\project\arachne\web\trunk\muri_7z;E:\project\arachne\
web\trunk\colorWIN;D:\Program Files\TortoiseSVN\bin;C:\Python33;E:\pro
2816 org.jetbrains.idea.maven.server.RemoteMavenServer -Djava.awt.headless=true
-Xmx512m -Dfile.encoding=GBK
4304 com.muri.web.common.Booter -agentlib:jdwp=transport=dt_socket,address=127.0
.0.1:58490,suspend=y,server=n -Dfile.encoding=UTF-8
9432 sun.tools.jps.Jps -lmv -Denv.class.path=.;D:\Program Files\Java\jdk1.7.0_07
lib\dt.jar;D:\Program Files\Java\jdk1.7.0_07lib\tools.jar;D:\Program Files\Java\
jdk1.7.0_07bin -Dapplication.home=D:\Program Files\Java\jdk1.7.0_07 -Xms8m

其中4848為我的IDE的程序,2816為maven程序,4304為我的測試程式的程序,9432為jps自己的程序

jinfo(Configuration Info for Java):JVM配置資訊工具

可以輸出並修改執行時的java 程序的opts。用處比較簡單,用於輸出JAVA系統引數及命令列引數

命令格式:jinfo [ options ] [ pid ]

常用引數說明:

-flag 輸出,修改,JVM命令列引數

例如:

C:\Users\liu>jinfo 4304
Attaching to process ID 4304, please wait…
Debugger attached successfully.
Server compiler detected.
JVM version is 23.3-b01
Java System Properties:
…….
…….

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\liu>jstack 4304
2014-09-12 10:22:42
Full thread dump Java HotSpot(TM) 64-Bit Server VM (23.3-b01 mixed mode):

“QuartzScheduler_scheduler-NON_CLUSTERED_MisfireHandler” prio=6 tid=0x0000000012
d17800 nid=0x21d0 waiting on condition [0x000000001db7f000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at org.quartz.impl.jdbcjobstore.JobStoreSupport$MisfireHandler.run(JobSt
oreSupport.java:3963)
……
……

jstat(JVM statistics Monitoriing Tool):JVM統計資訊監視工具

對Java應用程式的資源和效能進行實時的命令列的監控,包括了對Heap size和垃圾回收狀況的監控
命令格式:jstat [ option pid [interval [ s | ms ] [count] ] ]
常用引數說明:
-gcutil 輸出已使用空間佔總空間的百分比
-gccapacity 輸出堆中各個區域使用到的最大和最小空間

例如:每隔1秒監控jvm記憶體一次,共監控5次

C:\Users\liu>jstat -gccapacity 4304 1s 5
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC
OC PGCMN PGCMX PGC PC YGC FGC
32064.0 514048.0 249472.0 12416.0 11072.0 172800.0 64256.0 1028096.0 702
08.0 70208.0 21248.0 83968.0 83008.0 83008.0 25 1
32064.0 514048.0 249472.0 12416.0 11072.0 172800.0 64256.0 1028096.0 702
08.0 70208.0 21248.0 83968.0 83008.0 83008.0 25 1
32064.0 514048.0 249472.0 12416.0 11072.0 172800.0 64256.0 1028096.0 702
08.0 70208.0 21248.0 83968.0 83008.0 83008.0 25 1
32064.0 514048.0 249472.0 12416.0 11072.0 172800.0 64256.0 1028096.0 702
08.0 70208.0 21248.0 83968.0 83008.0 83008.0 25 1
32064.0 514048.0 249472.0 12416.0 11072.0 172800.0 64256.0 1028096.0 702
08.0 70208.0 21248.0 83968.0 83008.0 83008.0 25 1

C:\Users\liu>jstat -gcutil 4304 1s 5
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 0.00 73.56 57.80 49.91 25 0.217 1 0.218 0.435
0.00 0.00 74.13 57.80 49.91 25 0.217 1 0.218 0.435
0.00 0.00 74.13 57.80 49.91 25 0.217 1 0.218 0.435
0.00 0.00 74.13 57.80 49.91 25 0.217 1 0.218 0.435
0.00 0.00 74.13 57.80 49.91 25 0.217 1 0.218 0.435

一些術語的中文解釋:

     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= 使用二進位制形式輸出jvm的heap內容到檔案中, live子選項是可選的,假如指定live選項,那麼只輸出活的物件到檔案.
-histo[:live] 列印每個class的例項數目,記憶體佔用,類全名資訊. VM的內部類名字開頭會加上字首”*”. 如果live子引數加上後,只統計活的物件數量.
-F 強迫.在pid沒有相應的時候使用-dump或者-histo引數. 在這個模式下,live子引數無效.

例如:以二進位制形式輸入當前堆記憶體映像到檔案data.hprof中

C:\Users\liu>jmap -dump:live,format=b,file=data1.hprof 4304
Dumping heap to C:\Users\liu\data1.hprof …
Heap dump file created

生成的檔案可以使用jhat工具進行分析,在OOM(記憶體溢位)時,分析大物件,非常有用
通過使用如下引數啟動JVM,也可以獲取到dump檔案:
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./java_pid.hprof

  在jvm發生記憶體溢位時生成記憶體映像檔案

jhat(JVM Heap Analysis Tool):JVM堆轉儲快照分析工具

用於對JAVA heap進行離線分析的工具,他可以對不同虛擬機器中匯出的heap資訊檔案進行分析,如LINUX上匯出的檔案可以拿到WINDOWS上進行分析,可以查詢諸如記憶體方面的問題。
命令格式:jhat dumpfile(jmap生成的檔案)

例如:分析jmap匯出的記憶體映像

C:\Users\liu>jhat data1.hprof
Reading from data1.hprof…
Dump file created Fri Sep 12 10:27:25 CST 2014
Snapshot read, resolving…
Resolving 879257 objects…
Chasing references, expect 175 dots……………………………………..
…………………………………………………………………….
…………………………………………..
Eliminating duplicate references………………………………………..
…………………………………………………………………….
………………………………………..
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

執行成功後,訪問 http://localhost:7000 即可檢視記憶體資訊,
MAT(Memory Analyzer Tool):一個基於Eclipse的記憶體分析工具

這是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