JVM性能监控工具

jps

  • USAGE:

      jps [-help]
      jps [-q] [-mlvV] []
    
  • OPTION

    • -q: 只输出进程id,不输出名称
    • -m: 查看传递给main函数的参数
    • -l: 输出main函数所在类的完整包名jar路径
    • -v: 显示传递给虚拟机的参数
    • -V: 输出通过flag文件传递到JVM中的参数
    • -Joption: 传递参数给JVM,例如-J-Xms48m
    • : 指定主机

jstat

  • DESCRIPTION: 查看JVM运行时的统计信息

  • USAGE:

    jstat -help|-options
    jstat -
  • EXPLANATION:

    • -options: 下文提到的参数
    • vmid: 通过jps命令查出的进程id
  • OPTION

    • -statOption

      • -class: 显示ClassLoader相关的统计信息

      • -compiler: 显示JIT编译器的统计信息

      • -gc: 显示GC相关堆的统计信息

      • -gccapacity: 显示各个代的容量以及使用情况

      • -gccause: 显示垃圾收集的相关统计信息(同-gcutil),以及最近一次垃圾收集的诱发原因

      • -gcnew: 显示新生代相关信息

      • -gcnewcapacity: 显示新生代大小和使用情况

      • -gcold: 显示老年代和元空间/永久区的相关信息

      • -gcoldcapacity: 显示老年代的大小

      • -gcmetacapacity: 显示元空间/永久区的大小

      • -gcutil: 显示垃圾收集的相关统计信息

      • -printcompilation: 显示编译行为的统计信息

    • -t: 在第一行显示一个Timestamp列表明程序的运行时间

    • -h: 在周期性输出数据时, 多少行以后输出一行表头信息

    • interval: 指定输出统计数据的时间周期, 单位为[s|ms]

    • count: 指定一共输出多少次数据

  • EXAMPLE

    1. 每1秒输出一次ClassLoader统计信息, 每5行打印一次表头, 总共输出10次
    • 输入: jstat -class -t -h5 14927 1s 10
    • 输出:
    Timestamp       Loaded  Bytes  Unloaded  Bytes     Time   
    56.3            394     817.2     0       0.0      0.04
    57.3            394     817.2     0       0.0      0.04
    58.3            394     817.2     0       0.0      0.04
    59.3            394     817.2     0       0.0      0.04
    60.3            394     817.2     0       0.0      0.04
    Timestamp       Loaded  Bytes  Unloaded  Bytes     Time   
    61.3            394     817.2     0       0.0      0.04
    62.3            394     817.2     0       0.0      0.04
    63.3            394     817.2     0       0.0      0.04
    64.3            394     817.2     0       0.0      0.04
    65.3            394     817.2     0       0.0      0.04
    

jinfo

  • DESCRIBE: 查看JAVA进程的配置信息, 包括Java系统属性以及JVM命令行参数, 对于查找JVM默认参数十分有用, 在64-bit的JVM上使用需要使用-J-d64选项, 例如: jinfo -J-d64 -sysprops 14607

  • USAGE:

    jinfo [option] 
      (to connect to running process)
    jinfo [option] 
      (to connect to a core file)
    jinfo [option] [server_id@]
      (to connect to remote debug server)
    
  • OPTION

    • no-option 以键值对的形式打印Java系统属性以及JVM命令行参数

    • -flag name 打印指定的JVM命令行参数的键值对

    • -flag [+|-]name 设定指定JVM命令行参数的布尔值

    • -flag name=value 设定指定JVM命令行参数的值

    • -flags 以键值对的形式打印JVM命令行参数

    • -sysprops 以键值对的形式打印**Java系统属性

  • EXAMPLE

    jinfo flag  PrintGCDetails 24984 # 显示JVM是否有打印GC日志
    -XX:-PrintGCDetails # 没有打印GC日志
    jinfo -flag  PrintGCDetails 21286 # 修改JVM参数, 使之打印GC日志
    
  • ATTENTION

    • jinfo支持修改部分JVM参数并立即生效, 但并不是所有的参数都支持动态修改

jmap

  • DESCRIBE: 导出java堆dump文件, 查看堆内对象的统计信息, 查看堆内对象实例统计信息, 查看Classloader信息以及finalizer队列信息;在64-bit的JVM上使用需要使用-J-d64选项, 例如: jmap -J-d64 -heap pid

  • USAGE:

    jmap [option] 
        (to connect to running process)
    jmap [option] 
        (to connect to a core file)
    jmap [option] [server_id@]
        (to connect to remote debug server)
    
  • OPTION

    • : 没有指定选项时, 会输出所有共享的对象映射; 包括开始地址, 映射大小, 全路径

    • -dump:[live,]format=b, file=filename: 将当前Java堆的快照以hprof二进制格式输出到filename文件中;live选项是可选的, 但如果指定了, 只有活动的对象会被记录到快照中; 可以使用jhat,Visual VM,MAT等工具查看得到的快照文件

    • -finalizerinfo: 打印正在等待释放(在finalizer队列中)的对象的信息

    • -heap: 查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况; 另外, String常量池的使用情况也会被打印出来

    • -histo[:live]: 打印堆信息的统计直方图; 对于每个Java类, 会打印他们的类名, 对象数量, 内存占用等信息; JVM内部的类会以星号作为前缀打印, 如果带上live选项则只统计活对象

    • -clstats: 打印类的统计信息

    • -F: 强制选项, 当使用jmap -dumpjmap -histo命令, 目标进程没有响应时可使用-F选项, 这种情况下live选项将不被支持

  • EXAMPLE

    jmap -J-d64 -histo:live  25530
    
    num     #instances         #bytes  class name
    ----------------------------------------------
      1:           998          85592  [C
      2:           459          52512  java.lang.Class
      3:           504          25120  [Ljava.lang.Object;
      4:             8          24984  [B
      5:           987          23688  java.lang.String
      6:            79           5688  java.lang.reflect.Field
      7:           256           4096  java.lang.Integer
      8:           113           3616  java.util.Hashtable$Entry
      9:            90           3600  java.lang.ref.SoftReference
    

jhat

  • DESCRIPTION: JDK自带的堆分析分析工具, jhat命令可以对Java堆快照文件进行分析, 它启动一个HTTP服务器, 开发人员可以通过浏览器查看分析结果

  • USAGE:

    jhat [-stack ] [-refs ] [-port ] [-baseline ] [-debug ] [-version] [-h|-help] 
    
  • OPTIONS:

    • -J: 直接传递参数到运行时系统, 例如: -J-mx512m指定使用的最大堆空间为512MB

    • -stack false: 关闭跟踪对象分配调用堆栈

    • -refs false: 关闭对对象引用的跟踪

    • -port : 设置HTTP服务器的端口, 默认值是7000

    • -exclude : Specify a file that lists data members that should be excluded from the reachableFrom query

    • -baseline : Specify a baseline object dump. Objects in both heap dumps with the same ID and same class will be marked as not being "new"

    • -debug : 设置debug级别

      • 0: 无debug输出

      • 1: Debug hprof file parsing

      • 2: Debug hprof file parsing, no server

    • -version: 显示版本号

    • -h|-help: 显示帮助信息

    • : 要分析的堆快照文件

jstack

  • DESCRIPTION: 导出应用程序的线程堆栈, jstack不仅能够得到线程堆栈, 还能够自动进行死锁检查, 输出找到的死锁信息

  • USAGE:

    jstack [-l] 
          (to connect to running process)
    jstack -F [-m] [-l] 
          (to connect to a hung process)
    jstack [-m] [-l]  
          (to connect to a core file)
    jstack [-m] [-l] [server_id@]
          (to connect to a remote debug server)
    
  • OPTIONS

    • -F: 在进程无响应时强制堆栈转储

    • -l: 会打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况

    • -m: 不仅会输出Java堆栈信息,还会输出C/C++堆栈信息(比如Native方法)

jstatd

  • DESCRIPTION: 用于远程主机信息收集, 本质是一个RMI程序, 它的作用相当于代理服务器, 建立本地计算机与远程监控工具的通讯, jstatd将本地计算机的Java程序信息发送给远程计算机

  • USAGE

    1. 直接运行jstatd可能会出现拒绝访问异常
    access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write")
    java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write")
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
    at java.security.AccessController.checkPermission(AccessController.java:884)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at java.lang.System.setProperty(System.java:792)
    at sun.tools.jstatd.Jstatd.main(Jstatd.java:139)
    

    这是因为jstatd没有足够的权限所致

    1. 新建一个jstatd.all.policy文件, 加入以下内容
    grant codebase "path/to/tools.jar" {
    permission java.security.Allpermission;
    };
    
    1. 然后使用以下命令开启jstatd服务器, 默认情况下jstatd将会在1099端口开启RMI服务
    jstatd -J-Djava.security.policy=path/to/jstatd.all.policy
    
    1. 使用jstat, jinfo, jmap等工具连接远程jstatd服务器, 如:
    jstat -gcutil 460@localhost:1099  # 460是进程ID
    

jcmd

多功能命令行

hprof

性能统计工具(嵌入代码中)

JConsole

JDK自带图形化性能监控工具

Visual VM

可视化多合一故障诊断和性能监控工具(替代命令行甚至JConsole), 支持插件, JDK7后集成于JDK中

Mission Control

来自JRockit的图形化虚拟机诊断工具

使用飞行记录器需要在程序中加上参数: -XX:+UnlockCommercialFeatures -XX:+FlightRecorder

你可能感兴趣的:(JVM性能监控工具)