JVM性能监控工具

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • ** 本文中使用到的JDK 为 Oracle JDK 1.7 ** JDK本身提供了很多方便的JVM性能调优监控工...
    FX_SKY阅读 11,870评论 0 8
  • 当系统遇到一些问题或者异常的时候,我们往往会查看系统日志、JVM堆栈、GC日志,或者查看线程快照、堆转储快照等信息...
    wangmin阅读 3,046评论 0 10
  • 最近在温故《深入理解Java虚拟机》,对第四章的工具进行笔记记录,备忘。 jps 用来查看正在运行的虚拟机进程,功...
    duval阅读 685评论 0 0
  • 一、Linux下的性能监控工具 1.1 显式系统整体资源使用情况-top命令 top命令的输出可以分为两个部分:前...
    端木轩阅读 3,430评论 0 3
  • 参数设置 在Java虚拟机的参数中,有3种表示方法用“ps -ef |grep "java"命令,可以得到当前Ja...
    九问阅读 9,031评论 2 52