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代码  收藏代码
  1. webserver@WS12:~$ 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.   
  8.   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND  
  9. 16183 root      20   0 1564m 175m  12m S  126  1.5   0:03.82 java  
  10. 15581 root      20   0  305m  54m 9988 S    1  0.5   0:05.13 java  
  11. 15689 www-data  20   0 55084  28m  956 S    1  0.2   0:01.51 nginx  
  12. 15688 www-data  20   0 55332  28m  956 S    0  0.2   0:04.63 nginx  
  13. 16182 webserver       20   0 19356 1528 1064 R    0  0.0   0:00.02 top  
  14.     1 root      20   0 23704 1932 1296 S    0  0.0   0:02.24 init  
  15.     2 root      20   0     0    0    0 S    0  0.0   0:00.01 kthreadd  
  16.     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代码  收藏代码
  1. webserver@WS11:/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代码  收藏代码
  1. webserver@WS12:~$ 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] [server_id@]<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代码  收藏代码
  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.   
  7. No deadlocks found.  
  8.   
  9. Thread 12172: (state = BLOCKED)  
  10.  - sun.misc.Unsafe.park(booleanlong@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
展开阅读全文

没有更多推荐了,返回首页