jstat命令(Java Virtual Machine Statistics Monitoring Tool)

来源:互联网 发布:宝宝学字软件 编辑:程序博客网 时间:2024/04/19 17:23

 一、jstat命令(Java Virtual Machine Statistics Monitoring Tool)

二、JConsole命令(Java Monitoring and Management Console)

三、jmap命令(Java Memory Map)

四、Java VisualVM(Java Virtual Machine Monitoring, Troubleshooting, and Profiling Tool)

五、MAT(Memory Analyzer Tool)工具入门介绍

 

1、介绍

Jstat用于监控基于HotSpot的JVM,对其堆的使用情况进行实时的命令行的统计,使用jstat我们可以对指定的JVM做如下监控:

- 类的加载及卸载情况

- 查看新生代、老生代及持久代的容量及使用情况

- 查看新生代、老生代及持久代的垃圾收集情况,包括垃圾回收的次数及垃圾回收所占用的时间

- 查看新生代中Eden区及Survior区中容量及分配情况

jstat工具特别强大,它有众多的可选项,通过提供多种不同的监控维度使我们可以从不同的维度来了解到当前JVM堆的使用情况。详细查看堆内各个部分的使用量,使用的时候必须加上待统计的Java进程号,可选的不同维度参数以及可选的统计频率参数。

它主要是用来显示GC及PermGen相关的信息,如果对GC不怎么了解,先看这篇文章:http://blog.csdn.net/xifeijian/article/details/17534233,否则其中即使你会使用jstat这个命令,你也看不懂它的输出。

 

 2、语法

     jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]

    generalOption - 单个的常用的命令行选项,如-help, -options, 或 -version

    outputOptions -一个或多个输出选项,由单个的statOption选项组成,可以和-t, -h, and -J等选项配合使用。

    statOption

    根据jstat统计的维度不同,可以使用如下表中的选项进行不同维度的统计,不同的操作系统支持的选项可能会不一样,可以通过-options选项,查看不同操作系统所支持选项,如:

 

OptionDisplays...class用于查看类加载情况的统计compiler用于查看HotSpot中即时编译器编译情况的统计gc用于查看JVM中堆的垃圾收集情况的统计gccapacity用于查看新生代、老生代及持久代的存储容量情况gccause用于查看垃圾收集的统计情况(这个和-gcutil选项一样),如果有发生垃圾收集,它还会显示最后一次及当前正在发生垃圾收集的原因。gcnew用于查看新生代垃圾收集的情况gcnewcapacity用于查看新生代的存储容量情况gcold用于查看老生代及持久代发生GC的情况gcoldcapacity用于查看老生代的容量gcpermcapacity用于查看持久代的容量gcutil用于查看新生代、老生代及持代垃圾收集的情况printcompilationHotSpot编译方法的统计

    -h n

        用于指定每隔几行就输出列头,如果不指定,默认是只在第一行出现列头。

    -JjavaOption

        用于将给定的javaOption传给java应用程序加载器,例如,“-J-Xms48m”将把启动内存设置为48M。如果想查看可以传递哪些选项到应用程序加载器中,可以相看如下的文档:

        Linux and Solaris:http://docs.oracle.com/javase/1.5.0/docs/tooldocs/solaris/java.html

        Windows: http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/java.html

    -t n

        用于在输出内容的第一列显示时间戳,这个时间戳代表的时JVM开始启动到现在的时间(注:在IBM JDK5中是没有这个选项的)。


    vmid  - VM的进程号,即当前运行的java进程号。

    还有两个关于显示频率的选项:

    interval间隔时间,单位可以是秒或者毫秒,通过指定s或ms确定,默认单位为毫秒。

    count-打印次数,如果缺省则打印无数次。

3、不同的统计维度(statOption)及输出说明

    -class

 

类加载情况的统计列名说明Loaded加载了的类的数量Bytes加载的类的大小,单为KbUnloaded卸载了的类的数量Bytes的类的大小,单为KbTime花在类的加载及的时间

 

     -compiler

 

HotSpot中即时编译器编译情况的统计 列名说明Compiled编译任务执行的次数Failed编译任务执行失败的次数Invalid编译任务非法执行的次数Time执行编译花费的时间FailedType最后一次编译失败的编译类型FailedMethod最后一次编译失败的类名及方法名

 

     -gc

 

JVM中堆的垃圾收集情况的统计列名说明S0C新生代中Survivor spaceS0当前容量的大小KB)S1C新生代Survivor spaceS1当前容量的大小KB)S0U新生代Survivor spaceS0容量使用的大小KB)S1U新生代Survivor spaceS1容量使用的大小KB)ECEden space当前容量的大小KB)EUEden space容量使用的大小KB)OCOld space当前容量的大小KB)OUOld space使用容量的大小KB)PCPermanent space当前容量的大小KB)PUPermanent space使用容量的大小KB)YGC从应用程序启动到采样时发生 Young GC 的次数YGCT从应用程序启动到采样时 Young GC 所用的时间(秒)FGC从应用程序启动到采样时发生 Full GC 的次数FGCT从应用程序启动到采样时 Full GC 所用的时间(秒)GCTT从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC

 

    -gccapacity

 

新生代、老生代及持久代的存储容量情况 列名说明NGCMN新生代的最小容大小KB)NGCMX新生代的最大容大小KB)NGC当前新生代的容大小KB)S0C当前新生代中survivor space 0的容量大小KB)S1C当前新生代中survivor space 1的容量大小KB)ECEden space当前容量的大小KB)OGCMN老生代的最小容大小KB)OGCMX老生代的最大容大小KB)OGC当前老生代的容大小KB)OC当前老生代的空间大小KB)PGCMN持久代的最小容大小KB)PGCMX持久代的最大容大小KB)PGC当前持久代的容大小KB)PC当前持久代的空间容大小KB)YGC从应用程序启动到采样时发生 Young GC 的次数FGC从应用程序启动到采样时发生 Full GC 的次数

 

    -gccause

     这个选项用于查看垃圾收集的统计情况(这个和-gcutil选项一样),如果有发生垃圾收集,它还会显示最后一次及当前正在发生垃圾收集的原因,它比-gcutil会多出最后一次垃圾收集原因以及当前正在发生的垃圾收集的原因。

 

用于查看垃圾收集的统计情况,包括最近发生垃圾的原因 列名说明LGCC最后一次垃圾收集的原因,可能为unknown GCCause”、“System.gc()”等GCC当前垃圾收集的原因

 

    -gcnew

 

新生代垃圾收集的情况列名说明S0C当前新生代中survivor space 0的容量大小(KB)S1C当前新生代中survivor space 1的容量大小KB)S0US0已经使用的大小KB)S1US1已经使用的大小KB)TTTenuring threshold,要了解这个参数,我们需要了解一点Java内存对象的结,在Sun JVM中,(除了数组之外的)对象都有两个机器字(words)的头部。第一个字中包含这个对象的标示哈希码以及其他一些类似锁状态和等标识信息,第二个字中包含一个指向对象的类的引用,其中第二个字节就会被垃圾收集算法使用到。
在新生代中做垃圾收集的时候,每次复制一个对象后,将增加这个对象的收集计数,当一个对象在新生代中被复制了一定次数后,该算法即判定该对象是长周期的对象,把他移动到老生代,这个阈值叫着tenuring threshold。这个阈值用于表示某个/些在执行批定次数youngGC后还活着的对象,即使此时新生的的Survior没有满,也同样被认为是长周期对象,将会被移到老生代中。MTTMaximum tenuring threshold,用于表示TT的最大值。DSSDesired survivor size (KB)ECEden space当前容量的大小(KB)EUEden space已经使用的大小(KB)YGC从应用程序启动到采样时发生 Young GC 的次数YGCT从应用程序启动到采样时 Young GC 所用的时间(单位秒)

 

    -gcnewcapacity

 

新生代的存储容量情况列名说明NGCMN          新生代的最小容大小KB)NGCMX    新生代的最大容大小KB)NGC    当前新生代的容大小KB)S0CMX新生代中SO的最大容大小KB)S0C当前新生代中SO的容大小KB)S1CMX新生代中S1的最大容大小KB)S1C当前新生代中S1的容大小KB)ECMX新生代中Eden的最大容大小KB)EC当前新生代中Eden的容大小KB)YGC从应用程序启动到采样时发生 Young GC 的次数FGC从应用程序启动到采样时发生 Full GC 的次数

 

    -gcold

 

老生代及持久代发生GC的情况列名说明PC当前持久代量的大小KB)PU久代使用量的大小KB)OC当前老年量的大小KB)OU老年代使用量的大小KB)YGC从应用程序启动到采样时发生 Young GC 的次数FGC从应用程序启动到采样时发生 Full GC 的次数FGCT从应用程序启动到采样时 Full GC 所用的时间(单位秒)GCT从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC

 

    -gcoldcapacity

 

老生代的存储容量情况列名说明OGCMN老生代的最小容量大小(KB)OGCMX老生代的最大容量大小(KB)OGC当前老生代的容大小KB)OC当前新生代的空间大小KB)YGC从应用程序启动到采样时发生 Young GC 的次数FGC从应用程序启动到采样时发生 Full GC 的次数FGCT从应用程序启动到采样时 Full GC 所用的时间(单位秒)GCT从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC

 

    -gcpermcapacity

    从应用程序启动到采样时发生 Full GC 的次数

持久代的存储容量情况列名说明PGCMN持久代的最小容量大小(KB)PGCMX持久代的最大容量大小(KB)PGC当前持久代的容大小KB)PC当前持久代的空间容大小KB)YGC从应用程序启动到采样时发生 Young GC 的次数FGCFGCT从应用程序启动到采样时 Full GC 所用的时间(单位秒)GCT从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC

 

    -gcutil

 

新生代、老生代及持代垃圾收集的情况列名说明S0Heap上的 Survivor space 0 区已使用空间的百分比S1Heap上的 Survivor space 1 区已使用空间的百分比EHeap上的 Eden space 区已使用空间的百分比OHeap上的 Old space 区已使用空间的百分比PPerm space 区已使用空间的百分比YGC从应用程序启动到采样时发生 Young GC 的次数YGCT从应用程序启动到采样时 Young GC 所用的时间(单位秒)FGC从应用程序启动到采样时发生 Full GC 的次数FGCT从应用程序启动到采样时 Full GC 所用的时间(单位秒)GCT从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC

 

    -printcompilation

 

HotSpot编译方法的统计列名说明Compiled编译任务执行的次数Size方法的字节码所占的字节数Type编译类型Method指定确定被编译方法的类名及方法名,类名中使名“/”而不是“.”做为命名分隔符,方法名是被指定的类中的方法,这两个字段的格式是由HotSpot中的“-XX:+PrintComplation”选项确定的。



 

4、使用示例

 

示例1

 

同时打印了young gc和full gc的总次数、总耗时。而,每次young gc消耗的时间,可以用相间隔的两行YGCT相减得到。每次full gc消耗的时间,可以用相隔的两行FGCT相减得到。例如红框中表示的第一行、第二行之间发生了1次young gc,消耗的时间为178.583-178.579-=0.004秒。

常驻内存区(P)的使用率,始终停留在稳定水平,说明常驻内存没有突变,比较正常。如果young gc和full gc能够正常发生,而且都能有效回收内存,常驻内存区变化不明显,则说明java内存释放情况正常,垃圾回收及时,java内存泄露的几率就会大大降低。但也不能说明一定没有内存泄露。

在上图收集的JVM信息中,你发现S0和S1的变化,对应YGC的变化趋势没有?思考一下为什么?

 

示例2)、

    以上,介绍了Jstat按百分比查看gc情况的功能。其实,它还有功能,例如加载类信息统计功能、内存池信息统计功能等,那些是以绝对值的形式打印出来的,比较少用,在此就不做介绍。

 

 

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

 

示例4)、jstat -compiler pid:显示VM实时编译的数量等信息。

 

1 0
原创粉丝点击