性能测试过程中,我们该如何监控java虚拟机内存的使用情况,用以判断JVM是否存在内存问题呢?如何判断JVM垃圾回收是否正常?一般的top指令基本上满足不了这样的需求,因为它主要监控的是总体的系统资源,很难定位到java应用程序。
在项目实践过程中,我们探索和使用了一款新工具--Jstat。

  Jstat是JDK自带的一个轻量级小工具。全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。可见,Jstat是轻量级的、专门针对JVM的工具,非常适用。

语法结构

jstat命令命令格式:
jstat [Options] vmid [interval] [count]\

参数说明:
Options — 选项,我们一般使用 -gcutil 查看gc情况
vmid — VM的进程号,即当前运行的java进程号
interval– 间隔时间,单位为秒或者毫秒
count — 打印次数,如果缺省则打印无数次

示例:
1、jstat -gc pid
  可以显示gc的信息,查看gc的次数,及时间。
  其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
  
2、jstat -gccapacity pid
  可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,
  如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,
  PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。
  其他的可以根据这个类推, OC是old内纯的占用量。

3、jstat -gcutil pid
  统计gc信息统计。

4、jstat -gcnew pid
  年轻代对象的信息。

5、jstat -gcnewcapacity pid
  年轻代对象的信息及其占用量。

6、jstat -gcold pid
   old代对象的信息。

7、stat -gcoldcapacity pid
  old代对象的信息及其占用量。

8、jstat -gcpermcapacity pid
  perm对象的信息及其占用量。

9、jstat -class pid
  显示加载class的数量,及所占空间等信息。

10、jstat -compiler pid
  显示VM实时编译的数量等信息。

11、jstat -printcompilation pid
   当前VM执行的信息。

   除了以上一个参数外,还可以同时加上 两个数字,如:jstat -printcompilation 3024 250 6是每250毫秒打印一次,一共打印6次,还可以加上-h3每三行显示一下标题。

结果说明:
  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 : 最大持有次数限制