美文网首页
JVM性能监控和故障处理工具(一)JDK的命令行工具

JVM性能监控和故障处理工具(一)JDK的命令行工具

作者: 云芈山人 | 来源:发表于2021-07-09 21:12 被阅读0次

给一个系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。这里的数据是指:运行日志、异常堆栈、GC日志、线程快照(threaddump/javacore文件)、堆转储快照(heapdump/hprof文件)等。

概述

  • JDK1.6的bin目录


    jdk1.6-bin.png
  • JDK工具的程序体积异常小巧,这是因为这些命令行工具大多数是jdk/lib/tools.jar类库的一层薄包装而已,它们的主要功能代码是在tools类库中实现的。
  • 采用Java代码来实现这些监控工具是有特别用意的:当应用程序部署到生产环境后,无论是直接接触物理服务器还是远程Telnet到服务器上都可能会受到限制。借助tools.jar类库里面的接口,我们可以直接在应用程序中实现功能强大的监控分析功能。
  • tools.jar


    tools.png
  • Sun JDK监控和故障处理工具


    性能监控和故障分析工具.png

1. jps(虚拟机进程状况工具)

  • JDK的很多小工具名字都参考了UNIX命令方式,jps(JVM Process Status Tool)是其中的典型。除了名字像UNIX的ps命令之外,它的功能也和ps命令类似:可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class,mian()函数所在类)名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID).
  • 虽然功能单一,它是使用频率最高的JDK命令工具,因其他的JDK工具大多需要输入查询到的LVMID来确定要监控的是哪一个虚拟机进程。
  • 对于本地虚拟机进程,LVMID与操作系统的进程ID(Process Identifier)是一致的。

jps 命令格式

jps [ options ]  [ hostid ]
  1. hostid
    jps 可通过RMI协议查询开启了RMI服务的远程虚拟机进程状态,hostid为RMI注册表中注册的主机名。
  2. options
    jps的option选项.png

jps 执行样例

D:\Program Files\Java\jdk1.6\bin>jps -q
2980

D:\Program Files\Java\jdk1.6\bin>jps -l
17960 sun.tools.jps.Jps

D:\Program Files\Java\jdk1.6\bin>jps -m
11748 Jps -m

D:\Program Files\Java\jdk1.6\bin>jps -v
10380 Jps -Denv.class.path=.;D:\Program Files\Java\jdk1.8.0_40\lib;D:\Program Files\Java\jdk1.8.0_40\lib\tools.jar -Dapplication.home=D:\Program Files\Java\jdk1.6 -Xms8m

2. jstat(虚拟机统计信息监视工具)

  • jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具。
  • 它可显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形界面,只提供纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。

jstat 命令格式

jstat [ option vmid [ interval [ s|ms ] [ count ] ]  ]
  1. vmid
    命令格式中的VMID与LVMID:如果本地虚拟机进程,VMID与LVMID是一致的,如果是远程虚拟机进程,那VMID的格式应是
[ protocol : ][ // ] lvmid [ @hostname[ :port] / servername ]
  1. option
    代表用户查询的虚拟机信息,主要分为3类:类装载、垃圾收集、运行期吧编译状况。
    jstat的option选项.png

jstat 执行样例

D:\Program Files\Java\jdk1.6\bin>jstat -gc 2764 250 20

每250毫秒查询一次进程2764垃圾收集状况,一共查询20次。

3. jinfo (Java配置信息工具)

  • jinfo(Configuration Info for Java )的作用是实时地查看和调整虚拟机的各项参数。
  • 使用jps命令的-v参数可查看虚拟机启动时显式指定的参数列表,如果想看未显式指定的参数的系统默认值,除找资料外,就只能使用jinfo的-flag选项进行查询(如果只限于JDK1.6及以上版本,使用java -XX:+PrintFlagsFinal查看参数默认值也是一个很好的选择)

jinfo 命令格式

jinfo [ option ] pid

jinfo执行样例

D:\Program Files\Java\jdk1.6\bin>jinfo -flag CMSInitiatingOccupanyFraction 1444
CMSInitiatingOccupanyFraction =85

4. jmap(Java内存映像工具)

  • jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为heapdump或dump文件)。
  • jmap的作用不仅仅是为了获取dump文件,它还可查询finalize执行队列、Java堆和永久代的详细信息,如空间使用率、当前用的是哪种收集器等。
  • 和jinfo命令一样,jmap有不少功能在Windows平台下都是受限的,除了生成dump文件的-dump选项和用于查看每个类的实例、空间占用统计的-histo选项在所有操作系统都提供之外,其余选项只能在Linux/Solaris下使用。

jmap 命令格式

jmap [ option ] vmid
jmap的option选项.png

jmap 执行样例

jmap -dump:format=b,file=eclipse.bin 3500
Dumping heap to C:\IcyFenix\eclipse.bin ...
Heap dump file created

5. jhat(虚拟机堆转存储快照分析工具)

  • Sun JDK提供jhat( JVM Heap Analysis Tool )命令与jmap搭配使用,来分析jmap生成的堆转储快照。
  • 内置了一个微型的HTTP/HTML服务器,生成dump文件的分析结果后,可在浏览器中查看。
  • 一般不直接使用jhat命令去分析dump文件,原因如下、
    1. 一般不会再部署应用程序的服务器上直接分析dump文件,比较耗费资源。
    2. jhat的分析功能相对比较简陋。
  • 分析结果一般是以包为单位进行分组显示,分析内存泄露问题主要会使用到其中的“Heap Histogram”(与jmap -histo 功能一样)与OQL页签的功能。
    1. “Heap Histogram”
      可找到内存中总容量最大的对象
    2. OQL
      标准的对象查询语言,使用类似SQL的语法对内存中的对象进行查询统计。

6. jstack(Java 堆栈跟踪工具)

  • jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)。
  • 线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈集合。
  • 生成快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。

jstack 命令格式

jstack [ option ] vmid
  • option


    jstack的option选项.png

7. HSDIS(JIT生成代码反汇编)

Java虚拟机规定中,详细描述了虚拟机指令集中每条指令的执行过程、执行前后对操作数栈、局部变量表的影响等细节。随着技术发展,虚拟机规范中的描述逐渐成为“概念模型”。基于这个原因,我们分析程序的执行语义问题(虚拟机做了什么)时,在字节码层面上分析完全可行,按分析程序的执行行为问题(虚拟机是怎么做的、性能如何)时,在字节码层面上分析就没有什么意义了,需要通过其他方式解决。

  • HSDIS是一个Sun官方推荐的HotSpot虚拟机JIT编译代码的反汇编插件,它包含在HotSpot虚拟机的源码之中,但没有提供编译后的程序。
  • 它的作用是让HotSpot的-XX:+PrintAssembly指令调用它来把动态生成的本地代码还原为汇编代码输出,同时还生成了大量非常有价值的注释,这样我们就可以通过输出的代码来分析问题。

相关文章

网友评论

      本文标题:JVM性能监控和故障处理工具(一)JDK的命令行工具

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