Jstat是JDK自帶的一個輕量級小工具。全稱“Java Virtual Machine statistics monitoring tool”,它位于java的bin目錄下,主要利用JVM内建的指令對Java應用程式的資源和性能進行實時的指令行的監控,包括了對Heap size和垃圾回收狀況的監控。可見,Jstat是輕量級的、專門針對JVM的工具,非常适用。
jstat工具特别強大,有衆多的可選項,詳細檢視堆内各個部分的使用量,以及加載類的數量。使用時,需加上檢視程序的程序id,和所選參數。
執行:cd $JAVA_HOME/bin中執行jstat,注意jstat後一定要跟參數。
文法結構:
Usage: jstat -help|-options
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
參數解釋:
Options — 選項,我們一般使用 -gcutil 檢視gc情況
vmid — VM的程序号,即目前運作的java程序号
interval– 間隔時間,機關為秒或者毫秒
count — 列印次數,如果預設則列印無數次
stat -printcompilation pid:目前VM執行的資訊。
-gcutil參數
S0 — Heap上的 Survivor space 0 區已使用空間的百分比
S1 — Heap上的 Survivor space 1 區已使用空間的百分比
E — Heap上的 Eden space 區已使用空間的百分比
O — Heap上的 Old space 區已使用空間的百分比
P — Perm space 區已使用空間的百分比
YGC — 從應用程式啟動到采樣時發生 Young GC 的次數
YGCT– 從應用程式啟動到采樣時 Young GC 所用的時間(機關秒)
FGC — 從應用程式啟動到采樣時發生 Full GC 的次數
FGCT– 從應用程式啟動到采樣時 Full GC 所用的時間(機關秒)
GCT — 從應用程式啟動到采樣時用于垃圾回收的總時間(機關秒)
jstat使用過程如下:
sudo jps用來顯示本地的java程序,可以檢視本地運作着幾個java程式,并顯示他們的程序号。
1,使用 top指令檢視java的pid,發現有2個java程序,不确定哪個對應的是web應用的程序号
Html代碼
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLyFGdz9lbvNWavw1cldWYtl2Lc12bj5SZ5VGdp5yM0JXZzVGZvw1LcpDc0RHaiojIsJye.png)
- [email protected]:~$ top
- top - 11:34:00 up 112 days, 10:48, 2 users, load average: 0.77, 0.36, 0.26
- Tasks: 247 total, 1 running, 246 sleeping, 0 stopped, 0 zombie
- Cpu(s): 15.8%us, 1.5%sy, 0.0%ni, 82.5%id, 0.0%wa, 0.0%hi, 0.1%si, 0.0%st
- Mem: 12321892k total, 2440448k used, 9881444k free, 515004k buffers
- Swap: 31249400k total, 112k used, 31249288k free, 995320k cached
- PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
- 16183 root 20 0 1564m 175m 12m S 126 1.5 0:03.82 java
- 15581 root 20 0 305m 54m 9988 S 1 0.5 0:05.13 java
- 15689 www-data 20 0 55084 28m 956 S 1 0.2 0:01.51 nginx
- 15688 www-data 20 0 55332 28m 956 S 0 0.2 0:04.63 nginx
- 16182 webserver 20 0 19356 1528 1064 R 0 0.0 0:00.02 top
- 1 root 20 0 23704 1932 1296 S 0 0.0 0:02.24 init
- 2 root 20 0 0 0 0 S 0 0.0 0:00.01 kthreadd
- 3 root RT 0 0 0 0 S 0 0.0 0:00.02 migration/0
2,使用 ps -ef | grep java,可以看到java應用程式對應的程序号 ps -ef | grep tomcat 看到的東西更加少,好找些
Html代碼
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLyFGdz9lbvNWavw1cldWYtl2Lc12bj5SZ5VGdp5yM0JXZzVGZvw1LcpDc0RHaiojIsJye.png)
- [email protected]:/usr/local/resin$ ps -ef | grep java
- root 17778 1 0 13:10 pts/0 00:00:16 /usr/lib/jvm/java-6-sun-1.6.0.20/bin/java -Djava.util.logging.manager=com.caucho.log.LogManagerImpl -Djavax.management.builder.initial=com.caucho.jmx.MBeanServerBuilderImpl -Djava.awt.headless=true -Dresin.home=/usr/local/resin -Dresin.root=/usr/local/resin/ -Xrs -Xss256k -Xmx32m -Dcom.sun.management.jmxremote -d64 com.caucho.boot.WatchdogManager -resin-home /usr/local/resin -conf /usr/local/resin/conf/resin-8080.conf start
- root 18293 17778 8 13:56 pts/0 00:07:14 /usr/lib/jvm/java-6-sun-1.6.0.20/bin/java -Djava.util.logging.manager=com.caucho.log.LogManagerImpl -Djava.system.class.loader=com.caucho.loader.SystemClassLoader -Djavax.management.builder.initial=com.caucho.jmx.MBeanServerBuilderImpl -Djava.awt.headless=true -Dresin.home=/usr/local/resin [color=red]-Xmx4096m -Xms4096m -Xmn1024m -Xss1m -Xdebug -Dcom.sun.management.jmxremote -XX:PermSize=512M -XX:MaxPermSize=1024M[/color] -Djava.util.logging.manager=com.caucho.log.LogManagerImpl -Djavax.management.builder.initial=com.caucho.jmx.MBeanServerBuilderImpl -Djava.awt.headless=true -Dresin.home=/usr/local/resin -Dresin.root=/usr/local/resin/ -Dcom.sun.management.jmxremote -Djava.util.logging.manager=com.caucho.log.LogManagerImpl -Djavax.management.builder.initial=com.caucho.jmx.MBeanServerBuilderImpl -Djav .awt.headless=true -Dresin.home=/usr/local/resin -Dresin.root=/usr/local/resin/ -Dcom.sun.management.jmxremote com.caucho.server.resin.Resin --root-directory /usr/local/resin -conf /usr/local/resin/conf/resin-8080.conf -socketwait 29006 -resin-home /usr/local/resin start
- webserver 18867 14532 0 15:21 pts/0 00:00:00 grep --color=auto java
3,執行 sudo jstat -gcutil 程序号 5s(每隔5秒檢視jvm垃圾回收情況)
Html代碼
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLyFGdz9lbvNWavw1cldWYtl2Lc12bj5SZ5VGdp5yM0JXZzVGZvw1LcpDc0RHaiojIsJye.png)
- [email protected]:~$ sudo jstat -gcutil 16183 5s
- S0 S1 E O P YGC YGCT FGC FGCT GCT
- 5.02 0.00 49.75 30.01 65.49 14 0.421 1 0.121 0.542
- 5.02 0.00 88.80 30.01 65.62 14 0.421 1 0.121 0.542
- 0.00 96.66 32.79 30.44 65.81 15 0.428 1 0.121 0.549
- 0.00 96.66 72.60 30.44 65.93 15 0.428 1 0.121 0.549
- 1.20 0.00 38.76 30.61 66.01 16 0.439 1 0.121 0.560
- 1.20 0.00 63.20 30.61 66.08 16 0.439 1 0.121 0.560
- 0.00 1.28 30.78 30.71 66.45 17 0.446 1 0.121 0.567
- 0.00 1.28 67.98 30.71 66.57 17 0.446 1 0.121 0.567
- 1.65 0.00 8.04 30.81 66.67 18 0.452 1 0.121 0.573
- 1.65 0.00 47.42 30.81 66.82 18 0.452 1 0.121 0.573
- 1.65 0.00 90.38 30.81 66.91 18 0.452 1 0.121 0.573
- 0.00 1.41 37.02 30.94 66.97 19 0.458 1 0.121 0.578
- 0.00 1.41 75.75 30.94 66.98 19 0.458 1 0.121 0.578
- 1.19 0.00 18.04 31.04 67.13 20 0.465 1 0.121 0.585
其他可用option:
可以通過指令:jstat -options option,看到支援的option參數
-class (類加載器)
-compiler (JIT)
-gc (GC堆狀态)
-gccapacity (各區大小)
-gccause (最近一次GC統計和原因)
-gcnew (新區統計)
-gcnewcapacity (新區大小)
-gcold (老區統計)
-gcoldcapacity (老區大小)
-gcpermcapacity (永久區大小)
-gcutil (GC統計彙總)
-printcompilation (HotSpot編譯統計)
jstat -gcutil pid: 統計gc資訊統計。
jstat -gccapacity pid: 可以顯示,VM記憶體中三代(young,old,perm)對象的使用和占用大小
-gccapacity參數:
NGCMN:年輕代(young)中初始化(最小)的大小 (位元組)
NGCMX:年輕代(young)的最大容量 (位元組)
NGC:年輕代(young)中目前的容量 (位元組)
S0C:年輕代中第一個survivor(幸存區)的容量 (位元組)
S1C:年輕代中第二個survivor(幸存區)的容量 (位元組)
EC:年輕代中Eden(伊甸園)的容量 (位元組)
OGCMN:old代中初始化(最小)的大小 (位元組)
OGCMX:old代的最大容量 (位元組)
OGC:old代目前新生成的容量 (位元組)
OC:Old代的容量 (位元組)
PGCMN:perm代中初始化(最小)的大小 (位元組)
PGCMX:perm代的最大容量 (位元組)
PGC:perm代目前新生成的容量 (位元組)
PC:Perm(持久代)的容量 (位元組)
YGC:從應用程式啟動到采樣時年輕代中gc次數
FGC:從應用程式啟動到采樣時old代(全gc)gc次數
jps -mlVv localhost
jps [ options ] [ hostid ]
其中,options可以用:
-q (安靜)
-m (輸出傳遞給main方法的參數)
-l (顯示完整路徑)
-v (顯示傳遞給JVM的指令行參數)
-V (顯示通過flag檔案傳遞給JVM的參數)
-J (和其他Java工具類似用于傳遞參數給指令本身要調用的java程序);
hostid是主機id,預設localhost。
Jstack Usage:
jstack [-l] <pid>
(to connect to running process 連接配接到正在運作的程序)
jstack -F [-m] [-l] <pid>
(to connect to a hung process 連接配接到懸挂的程序)
jstack [-m] [-l] <executable> <core>
(to connect to a core file 連接配接到core檔案)
jstack [-m] [-l] [[email protected]]<remote server IP or hostname>
(to connect to a remote debug server 連接配接到遠端機器)
Options:
-F to force a thread dump. Use when jstack <pid> does not respond (process is hung)
-m to print both java and native frames (mixed mode)
-l long listing. Prints additional information about locks
-h or -help to print this help message
jstack 3713;
jstack -F 3713
jstack -l -m /opt/jdk1.6.0/bin/java core.659
可以觀察到jvm中目前所有線程的運作情況和線程目前狀态
Java代碼
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLyFGdz9lbvNWavw1cldWYtl2Lc12bj5SZ5VGdp5yM0JXZzVGZvw1LcpDc0RHaiojIsJye.png)
- Attaching to process ID 3713, please wait...
- Debugger attached successfully.
- Server compiler detected.
- JVM version is 20.4-b02
- Deadlock Detection:
- No deadlocks found.
- Thread 12172: (state = BLOCKED)
- - sun.misc.Unsafe.park(boolean, long) @bci=0 (Interpreted frame)
jmap:顯示java程序記憶體使用的相關資訊
jmap pid #列印記憶體使用的摘要資訊
jmap –heap pid #java heap資訊
jmap -histo:live pid #統計對象count ,live表示在使用
jmap -histo pid >mem.txt #列印比較簡單的各個有多少個對象占了多少記憶體的資訊,一般重定向的檔案
jmap -dump:format=b,file=mem.dat pid #将記憶體使用的詳細情況輸出到mem.dat 檔案
jvm配置列印GC相關資訊
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC
對應的日志會輸出到catalina的日志中去
jinfo -flag HeapDumpBeforeFullGC 29167 #檢視HeapDumpBeforeFullGC
jinfo: 檢視和修改JVM參數
Usage:
jinfo <option> <pid>
(to connect to a running process)
where <option> is one of:
-flag <name> to print the value of the named VM flag
-flag [+|-]<name> to enable or disable the named VM flag
-flag <name>=<value> to set the named VM flag to the given value
-h | -help to print this help message