美文网首页
JVM性能监控工具

JVM性能监控工具

作者: 荣儿飞 | 来源:发表于2018-01-05 12:43 被阅读0次

    jps

    • USAGE:

        jps [-help]
        jps [-q] [-mlvV] [<hostid>]
      
    • OPTION

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

    jstat

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

    • USAGE:

      jstat -help|-options
      jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
      
    • 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] <pid>
        (to connect to running process)
      jinfo [option] <executable <core="">
        (to connect to a core file)
      jinfo [option] [server_id@]<remote server="" ip="" or="" hostname="">
        (to connect to remote debug server)</remote></executable></pid>
      
    • 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] <pid>
          (to connect to running process)
      jmap [option] <executable <core>
          (to connect to a core file)
      jmap [option] [server_id@]<remote server IP or hostname>
          (to connect to remote debug server)
      
    • OPTION

      • <no 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 <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file>
      
    • OPTIONS:

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

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

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

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

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

      • -baseline <file>: 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 <int>: 设置debug级别

        • 0: 无debug输出

        • 1: Debug hprof file parsing

        • 2: Debug hprof file parsing, no server

      • -version: 显示版本号

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

      • <file>: 要分析的堆快照文件

    jstack

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

    • USAGE:

      jstack [-l] <pid>
            (to connect to running process)
      jstack -F [-m] [-l] <pid>
            (to connect to a hung process)
      jstack [-m] [-l] <executable> <core>
            (to connect to a core file)
      jstack [-m] [-l] [server_id@]<remote server IP or hostname>
            (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性能监控工具

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