JDK性能监控工具

414 阅读5分钟

1 jps

主要作用:列出Java进程

1.1 -v:可以显示传递给Java虚拟机的参数

20152 JpsDemo -XX:+PrintFlagsFinal -XX:SurvivorRatio=2 -javaagent:D:\IDEA\IDEA2017\installpath\IntelliJ IDEA 2017.3.7\lib\idea_rt.jar=56858:D:\IDEA\IDEA2017\installpath\IntelliJ IDEA 2017.3.7\bin -Dfile.encoding=UTF-8

1.2 -m:用于输出参数传递给Java进程(主函数)的参数

3108 Jps -m
20152 JpsDemo 1111
6380 RemoteMavenServer

1.3 -l:可以用于输出主函数的完整路径

11296 sun.tools.jps.Jps
13840
18260 org.jetbrains.jps.cmdline.Launcher
6380 org.jetbrains.idea.maven.server.RemoteMavenServer

2 jstat

jstat是一个可用于观察java应用程序运行时相关信息的工具

2.1参数格式

#格式
jstat -<option> [-t] [-h<lines>] <vmid> [interval] [<count>]]
  • - 常用参数如下

    -class:显示ClassLoader的相关信息
    -complier:显示JIT编译的相关信息
    -gc:显示与GC相关的堆信息
    -gcocpacity:显示各个代容量及使用情况
    -gccause:显示垃圾收集信息(同-gcutil),同时显示最后一个垃圾收集和当前正在垃圾收集诱发的原因
    -gcnew:显示新生代信息
    -gcnewcapacity:显示新生代大小与使用情况
    -gcold:显示老年代和永久代的信息
    -gcoldcapacity:显示老年代的大小
    -gcoldcapacity:显示老年代的大小
    -gcmetacapacity:显示元空间的大小
    -gcutil:显示垃圾收集器信息
    -printcompilation:输出JIT编译的方法信息
    
  • -t参数可以在输出信息上加上一个timestamp列,显示程序运行时间(从程序运行开始计算)

  • -h参数是指程序在周期打印数据的时候(配合interval和count进行,inteval是指每隔多久统计一次数据,count是指统计次数),会显示表头信息。就好比一个统计班级成绩Excel表格,表格第一行会列出科目名称,这就相当于表头,接下来每行会显示每个同学各科目的成绩,这相当于数据。当设置inteval为10的时候,每隔10条统计数据,又会重新输出表头信息。

  • inteval 指定统计时间间隔,单位毫秒
  • count 指定统计数据次数

2.2 常用参数

  1. -class

    Loaded:表示载入类的数量
    Bytes:载入类的合计大小
    UnLoaded:卸载类的数量
    Bytes:卸载类的大小
    Time:加载类和卸载类的总耗时
    
  2. -compiler

    Compiled:表示编译任务执行的次数
    Failed:表示编译失败的次数
    Invalid表示编译不可用的次数
    Time:表示编译的总耗时
    FileType:表示最后一次编译失败的类型
    FailedMethod:表示最后一次编译失败的类名和方法名
    
  3. -gc

    S0C:s0(from)的大小(单位KB)
    S1C:s1(from)的大小(单位KB)
    S0U:s0(from)已经使用过的空间(单位KB)
    S1U:s1(from)已经使用过的空间(单位KB)
    EC:eden区的大小(单位KB)
    EU:eden去使用的空间(单位KB)
    OC:老年代大小(KB)
    OU:老年代已经使用的空间(KB)
    MC:元空间大小(KB)
    MU:元空间使用的空间(KB)
    CCSC:当前压缩类空间的容量 (KB)
    CCSU:当前压缩类空间目前已使用空间 (KB)
    YGC:从应用程序启动到采样时年轻代中gc次数
    YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
    FGC:从应用程序启动到采样时old代gc次数
    FGCT:从应用程序启动到采样时old代gc所用时间(s)
    GCT:从应用程序启动到采样时gc用的总时间(s)
    
  4. -gccapacity

    NGCMN:年轻代中初始化的大小(KB)
    NGCMX:年轻代(young)的最大容量 (KB)
    NGC:年轻代中当前的容量 (字节)
    S0C:s0(from)的大小(单位KB)
    S1C:s1(from)的大小(单位KB)
    EC:eden区的大小(单位KB)
    OGCMN:old代中初始化的大小 (KB)
    OGCMX:old代的最大容量(KB)
    OGC:old代当前的容量 (KB)
    OC:老年代大小(KB)
    MCMN:metaspace(元空间)中初始化的大小 (KB)
    MCMX:metaspace(元空间)的最大容量 (KB)
    MC:metaspace(元空间)当前的容量 (KB)
    CCSMN:最小压缩类空间大小
    CCSMX:最大压缩类空间大小
    CCSC:当前压缩类空间大小
    YGC:从应用程序启动到采样时old代gc所用时间(s)
    FGC:从应用程序启动到采样时gc用的总时间(s)
    
  5. -gccause

    LGCC:上次GC的原因
    GCC:当前GC的原因
    
  6. -gcnew

    TT:新生代对象晋升到老年代对象的年龄
    MTT:新生代对象晋升到老年代对象的年龄最大值
    DSS:所需的survivor区的大小
    
  7. -gcnewcapacity

    S0CMX:s0区的最大值(KB)
    S1CMX:s1区的最大值(KB)
    ECMX:eden区的最大值(KB)
    
  8. -gcold

  9. -gcoldcapacity

  10. -gcmetacapacity

![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/48b78e0c5add4825862f560ec5f14e7c~tplv-k3u1fbpfcp-zoom-1.image)  
  1. -gcutil
![](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1f8b56f4625847b8bf609b342890603f~tplv-k3u1fbpfcp-zoom-1.image)  

3 jinfo

jinfo可以用来查看正在运行的Java应用程序的扩展参数,甚至支持在运行时,修改部分参数

#格式
jinfo <option> <pid>
option可以为:
  • -flag :打印指定Java虚拟机参数
  • -flag [+|-] :设置Java虚拟机参数的布尔值
  • -flag=:设置指定Java虚拟机参数的值

4 jmap

可以生成Java程序的堆Dump文件和查看堆内对象实例的统计数据,ClassLoader的信息和finalizer队列

4.1 统计Java对象信息

#统计进程id为17340的Java进程对象信息,并输出到 D:\tmp\jmap.txt
jmap -histo 17340 > D:\tmp\jmap.txt

4.2 观finalizer队列的对象

#查看进程id为16596的finalizer队列的对象jmap -finalizerinfo 16596

4.3 获取Java程序当前堆快照

#获取Java进程id为16596的堆快照文件,并输出到D:\tmp\heap.hprof jmap -dump:format=b,file=D:\tmp\heap.hprof 16596

5 jhat

该命令可以对堆快照文件进行分析,他启动一个HTTP服务器,通过浏览器,浏览快照文件
#heap.hprof是利用jmap导出的
jhat .\heap.hprof

打开浏览器,访问下面这条url
http://localhost:7000/

6 jstack

可用于导出Java应用程序的线程堆栈
#命令格式:-l 选项用于打印锁的附加信息
jstack [-l] 
#先通过jps获取Java进程的pid,然后利用jstack将线程堆栈文件导出到 D:\tmp\deadlock.txt
jstack -l 10616 > D:\tmp\deadlock.txt

检测到的死锁也会显示在文件最下方