美文网首页
java工具系列-jstat

java工具系列-jstat

作者: allanYan | 来源:发表于2016-11-03 18:20 被阅读0次

    概览

    JDK本身提供了很多工具,用于监控JVM和java程序的运行状况;Jstat可以查看虚拟机的GC,类加载等信息,可以通过jstat -options查看其支持的选项,在JDK7下,其支持的选项如下:

    options.png

    运行方式

    jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
    

    监控本地JVM没什么特殊的,通过jps查找到java进程ID,即可直接运行,例如:

    jstat -list  34673 #list counter names
    jstat -name  java.ci.totalTime 34673 #output counters matching given pattern
    jstat -snap -v 34673
    jstat -class 34673
    

    如果想要监控远程的JVM,则必须在远程服务器上启动RMI服务;

    1. 在远程服务器上建立jstatd.all.policy文件,内容为:
     grant codebase "file:${java.home}/../lib/tools.jar" {
        permission java.util.PropertyPermission "java.rmi.server.ignoreSubClasses", "write";
        permission java.util.PropertyPermission "sun.jvmstat.monitor.*", "read";
        permission java.util.PropertyPermission "java.io.tmpdir", "read";
        permission java.lang.RuntimePermission  "accessClassInPackage.sun.tools.jstatd";
        permission java.lang.RuntimePermission  "accessClassInPackage.sun.jvmstat.*";
        permission java.io.FilePermission "/tmp","read";
        permission java.io.FilePermission "/tmp/-","read";
        permission java.io.FilePermission "/tmp/*","read";
        permission java.net.SocketPermission "127.0.0.1:9090","connect,resolve";
        permission java.net.SocketPermission "127.0.0.1:1024-", "accept,resolve";
     };
    

    简单点,可以赋予所有权限:

    grant codebase "file:${java.home}/../lib/tools.jar" {  
       permission java.security.AllPermission;  
    };  
    
    1. 在远程服务器启动RMI Registry服务:
    jstatd  -p 9090 -J-Djava.security.policy=jstatd.all.policy 
    

    此处指定Registry服务的端口为9090,也可不指定,默认为1099;
    当然此处的端口需要与jstatd.all.policy中的端口保持一致。

    数据来源

    jstat统计的数据来源是哪呢?查看源码可以发现虚拟机会在tmp目录下为每个进程建立文件,文件的名称为进程ID,目录名前缀为hsperfdata_;具体的实现可以参考sun.jvmstat.perfdata.monitor.protocol.local.PerfDataFile
    通过如下命令:

    java -XX:+PrintFlagsInitial|grep Perf
    或
    java -XX:PrintFlagsFinal -version|grep Perf
    

    可以看到和PerfData相关的配置项和默认值如下:

         bool PerfAllowAtExitRegistration               = false             
         bool PerfBypassFileSystemCheck                 = false                
         intx PerfDataMemorySize                        = 32768             
         intx PerfDataSamplingInterval                  = 50        
         ccstr PerfDataSaveFile                         =       
         bool PerfDataSaveToFile                        = false               
         bool PerfDisableSharedMem                      = false                
         intx PerfMaxStringConstLength                  = 1024              
         bool UsePerfData                               = true       
    
    1. UsePerfData:如果关闭了UsePerfData这个参数,那么jvm启动过程中perf memory不会被创建;
    2. PerfDisableSharedMem:存储PerfData的内存是否禁止共享,不管这个参数是否设置,jvm在启动的时候都会分配一块内存来存放PerfData,只是说这个PerfData是不是其他进程可见的问题,如果设置为true,依赖PerfData的jps、jstat等都无法工作。

    选项说明

    class

    class.png
    1. Loaded: 加载的类的数量
    2. Bytes: 加载的类占有的内存
    3. Unloaded: 被卸载的类的数量
    4. Bytes:被卸载的类占有的内存
    5. Time: 类加载耗费的时间

    compiler

    compiler.png
    1. Compiler:JIT编译执行次数
    2. Failed:编译失败次数
    3. Invalid:无效的编译次数
    4. Time:编译耗费时间
    5. FailedType:最近一次编译失败类型
    6. FailedMethod:最近编译失败的类和方法

    gc

    gc.png
    1. S0C: survivor 0当前容量
    2. S1C: survivor 1当前容量
    3. S0U: survivor 0已使用空间
    4. S1U:survivor 1已使用空间
    5. EC: eden当前容量
    6. EU: eden已使用空间
    7. OC:old当前容量
    8. OU:old已使用空间
    9. PC:perm区当前容量
    10. PU:perm区已使用空间
    11. YGC: yong GC发生次数
    12. YGCT: yong GC耗费时间
    13. FGC: full GC发生次数
    14. FGCT:full GC耗费时间
    15. GCT: GC耗费总时间(yong gc time+full gc time)

    gccapacity

    gccapacity.png
    1. NGCMN: 新生代最小容量
    2. NGCMX: 新生代最大容量
    3. NGC: 新生代当前容量
    4. S0C: survivor 0当前容量
    5. S1C: survivor 1当前容量
    6. EC: eden区当前容量
    7. OGCMN: 老年代最小容量
    8. OGCMX: 老年代最大容量
    9. OGC: 老年代当前容量(Old Generation Capacity -Current)
    10. OC:old区当前容量(Old Space Capacity-Current)
    11. PGCMN: perm区最小容量
    12. PGCMX:perm区最大容量
    13. PGC:永久代当前容量
    14. PC: perm区当前容量
    15. YGC:yong gc次数
    16. FGC: full gc次数

    gccause

    gccause.png
    1. S0: survivor 0使用百分比;
    2. S1: survivor 1使用百分比;
    3. E: eden使用百分比;
    4. O: old使用百分比;
    5. P: perm使用百分比;
    6. YGC:yong gc次数
    7. YGCT:yong gc耗费时间
    8. FGC:full gc次数
    9. FGCT: full gc耗费时间
    10. GCT: gc耗费总时间
    11. LGCC:上一次gc原因
    12. GCC:当前gc原因

    gcnew

    gcnew.png
    1. S0C: survivor 0当前容量
    2. S1C: survivor 1当前容量
    3. S0U:survivor 0已使用容量
    4. S1U:survivor 1已使用容量
    5. TT: Tenuring threshold,可通过参数-XX:PretenureSizeThreshold进行设置;虚拟机采用了分代收集的思想来管理内存,给每个对象定义了一个对象年龄计数器。如果对象在Eden出生并经过第一次Minor GC后仍然存活,并且能被Survivor容纳的话,将被移动到survivor空间,并将对象年龄设为1。对象在survivor区中每熬过一次Minor GC,年龄就增加1;当它的年龄增加到一定程度时(默认为15),就会被晋升到老年代中。那分代年龄存放在哪呢?实际上内存中的每个对象都有对象头,包括Mark Word(标记字段)和 Klass Pointer(类型指针;分代年龄就存放在Mark Word中。
    6. MTT:Max Tenuring threshold,可通过参数-XX:MaxTenuringThreshold进行设置
    7. DSS:Desired survivor size (KB),假设MTT为15,如果Yong GC时发现所有年龄对象容量小于DSS,则将年龄设置为MTT;
    8. EC: eden当前容量
    9. EU: eden已使用容量
    10. YGC: yong gc发生次数
    11. YGCT: yong gc耗费总时间

    gcnewcapacity

    Paste_Image.png
    1. NGCMN: 新生代最小容量;
    2. NGCMX: 新生代最大容量;
    3. NGC: 新生代当前容量;
    4. S0CMX: survivor 0最大容量
    5. S0C:survivor 0当前容量
    6. S1CMX: survivor 1最大容量
    7. S1C:survivor 1当前容量
    8. ECMX: eden区最大容量
    9. EC : eden区当前容量
    10. YGC: yong gc次数
    11. FGC: full gc次数

    gcold

    Paste_Image.png
    1. PC: perm区当前容量
    2. PU:perm区已使用容量
    3. OC: old区当前容量
    4. OU: old区已使用容量
    5. YGC: yong gc次数
    6. FGC: full gc次数
    7. FGCT:full gc 耗费时间
    8. GCT:gc耗费总时间

    gcoldcapacity

    gcoldcapacity.png
    1. OGCMN: 老年代最大容量
    2. OGCMX: 老年代最小容量
    3. OGC: 老年代当前容量
    4. OC: old区当前容量
    5. YGC: yong gc次数
    6. FGC: full gc次数
    7. FGCT: full gc耗费时间
    8. GCT: gc耗费总时间

    gcpermcapacity

    gcpermcapacity.png
    1. PGCMN: 永久代最小容量
    2. PGCMX: 永久代最大容量
    3. PGC: 永久代当前容量
    4. PC: perm区当前容量
    5. YGC:yong gc 次数
    6. FGC: full gc次数
    7. FGCT: full gc时间
    8. GCT: gc耗费总时间

    gcutil

    Paste_Image.png
    1. S0: survivor 0已使用百分比
    2. S1:survivor 1已使用百分比
    3. E: eden已使用百分比
    4. O:old区已使用百分比
    5. P: perm区已使用百分比
    6. YGC:yong gc次数
    7. YGCT:yong gc时间
    8. FGC:full gc次数
    9. FGCT:full gc时间
    10. GCT: gc耗费总时间

    printcompilation

    printcompilation.png
    1. Compiled:编译次数
    2. Size:上次编译代码大小
    3. Type:上次编译类型
    4. Method: 上次编译的类和方法

    相关文章

      网友评论

          本文标题:java工具系列-jstat

          本文链接:https://www.haomeiwen.com/subject/gtbbuttx.html