天天看點

gc狀态查詢(java)

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代碼  

gc狀态查詢(java)
  1. [email protected]:~$ top  
  2. top - 11:34:00 up 112 days, 10:48,  2 users,  load average: 0.77, 0.36, 0.26  
  3. Tasks: 247 total,   1 running, 246 sleeping,   0 stopped,   0 zombie  
  4. 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  
  5. Mem:  12321892k total,  2440448k used,  9881444k free,   515004k buffers  
  6. Swap: 31249400k total,      112k used, 31249288k free,   995320k cached  
  7.   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND  
  8. 16183 root      20   0 1564m 175m  12m S  126  1.5   0:03.82 java  
  9. 15581 root      20   0  305m  54m 9988 S    1  0.5   0:05.13 java  
  10. 15689 www-data  20   0 55084  28m  956 S    1  0.2   0:01.51 nginx  
  11. 15688 www-data  20   0 55332  28m  956 S    0  0.2   0:04.63 nginx  
  12. 16182 webserver       20   0 19356 1528 1064 R    0  0.0   0:00.02 top  
  13.     1 root      20   0 23704 1932 1296 S    0  0.0   0:02.24 init  
  14.     2 root      20   0     0    0    0 S    0  0.0   0:00.01 kthreadd  
  15.     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代碼  

gc狀态查詢(java)
  1. [email protected]:/usr/local/resin$ ps -ef | grep java  
  2. 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  
  3. 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  
  4. webserver      18867 14532  0 15:21 pts/0    00:00:00 grep --color=auto java  

3,執行 sudo jstat -gcutil 程序号 5s(每隔5秒檢視jvm垃圾回收情況)

Html代碼  

gc狀态查詢(java)
  1. [email protected]:~$ sudo jstat -gcutil 16183 5s  
  2.   S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT  
  3.   5.02   0.00  49.75  30.01  65.49     14    0.421     1    0.121    0.542  
  4.   5.02   0.00  88.80  30.01  65.62     14    0.421     1    0.121    0.542  
  5.   0.00  96.66  32.79  30.44  65.81     15    0.428     1    0.121    0.549  
  6.   0.00  96.66  72.60  30.44  65.93     15    0.428     1    0.121    0.549  
  7.   1.20   0.00  38.76  30.61  66.01     16    0.439     1    0.121    0.560  
  8.   1.20   0.00  63.20  30.61  66.08     16    0.439     1    0.121    0.560  
  9.   0.00   1.28  30.78  30.71  66.45     17    0.446     1    0.121    0.567  
  10.   0.00   1.28  67.98  30.71  66.57     17    0.446     1    0.121    0.567  
  11.   1.65   0.00   8.04  30.81  66.67     18    0.452     1    0.121    0.573  
  12.   1.65   0.00  47.42  30.81  66.82     18    0.452     1    0.121    0.573  
  13.   1.65   0.00  90.38  30.81  66.91     18    0.452     1    0.121    0.573  
  14.   0.00   1.41  37.02  30.94  66.97     19    0.458     1    0.121    0.578  
  15.   0.00   1.41  75.75  30.94  66.98     19    0.458     1    0.121    0.578  
  16.   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代碼  

gc狀态查詢(java)
  1. Attaching to process ID 3713, please wait...  
  2. Debugger attached successfully.  
  3. Server compiler detected.  
  4. JVM version is 20.4-b02  
  5. Deadlock Detection:  
  6. No deadlocks found.  
  7. Thread 12172: (state = BLOCKED)  
  8.  - 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