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应用的进程号
2,使用 ps -ef | grep java,可以看到java应用程序对应的进程号 ps -ef | grep tomcat 看到的东西更加少,好找些
3,执行 sudo jstat -gcutil 进程号 5s(每隔5秒查看jvm垃圾回收情况)
其他可用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中当前所有线程的运行情况和线程当前状态
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
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应用的进程号
- webserver@WS12:~$ 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 看到的东西更加少,好找些
- webserver@WS11:/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垃圾回收情况)
- webserver@WS12:~$ 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] [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中当前所有线程的运行情况和线程当前状态
- 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