虚拟机性能监控与故障处理工具

一、概述

运行日志、异常堆栈、GC 日志、线程快照(threaddump/javacore文件)、堆转储快照

这些数据被用来分析数据,解决问题。

二、JDK 的命令行工具

1、jsp JVM Process Status Tool:虚拟机进程状况工具
  • 可以列出正在运行的虚拟机进程,

  • 并显示执行主类所在的类名称,以及这些进程的本地虚拟机唯一 ID (Local Virtual Machine Identifier, LVMID)

  • 使用频率最高的 JDK命令行工具,因为其他工具需要用他来查询 LVMID

  • 对于本地虚拟机来说,LVMID与操作系统的进程 ID(Process Identifier,PID)是一致的

    命令格式 jps [options] [hostid]

2、jstat JVM Statistics Monitoring Tool:虚拟机统计信息监视工具
  • 用于监视虚拟机各种运行状态信息的命令行工具

  • 可以显示本地或者远程虚拟机进程中的装载类,内存、垃圾收集、JIT编译等运行参数

  • 如果是本地虚拟机,LVMID 和 VMID 是一致的

    命令格式 jstat [option vmid [interval[s|ms] [count] ] ]

  • 如果是远程虚拟机

    命令格式 [protocol:] [//]lvmid[@hostname [:port]/servername]

3、jinfoConfiguration Info for Java :Java 配置信息工具
  • 实时查看和调整虚拟机的各项参数

  • jps 的-v 命令可以查看虚拟机启动时显式指定的参数列表,但是未被显式指定的需要 jinfo -flag

    命令格式 jinfo [option] pid

4、jmap Memory Map for Java:Java 内存映像工具
  • 用于生成堆转储快照 heapdump或 dump 文件

  • 还可以查询 finalize 执行队列,java 堆和永久代的详细信息

    命令格式 jmap [option] vmid

5、jhat JVM Heap Analysis Tool:虚拟机堆转储快照的分析工具
  • 与 jmap 搭配使用,用来分析 jmap 生成的快照,内置了一个微型的 HTTP/HTML服务器
  • 一般工作中不会使用,因为消耗硬件资源,会选择其他工具在另外的机器上进行分析
6、jstackStack Trace for Java: Java 堆栈跟踪工具
  • 用于生成虚拟机当前时刻的线程快照 threaddump/javacore文件

  • 线程快照就是当前虚拟机每一条线程正在执行的方法堆栈的集合

  • 生成线程快照的主要目的是定位线程出现长时间停顿的原因:如线程死锁,死循环,请求外部资源时间过长等

  • 线程出现停顿的时候调用 jstack 来查看各个线程的调用堆栈,就可以知道没有响应的线程在后台做什么

    命令格式 jstack [option] vmid

    thread类中新增的 「getAllStackTraces( )」方法用于获取虚拟机中所有线程的StackTraceElement对象

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

三、JDK 的可视化工具

1、JConsole Java Monitoring and Management Console Java 监视与管理控制台

  • 是一种基于 JMX 的可视化监视器、管理工具
  • 针对 JMX MBean 进行管理

2、VisualVM All-in-One Java Troubleshootign Tool多合一故障处理工具

  • 到目前为止随 jdk 发布的功能最强大的运行监视和故障处理程序
  • 显示虚拟机进程以及进程的配置,环境信息 (jps、jinfo)
  • 监视应用程序的 CPU、GC、堆、方法区以及线程的信息(jstat、jstack)
  • dump 以及分析堆转储快照 (jmap、jhat)
  • 方法级的程序运行性能分析,找出被调用最多,运行时间最长的方法
  • 离线程序快照:收集程序的运行时配置、线程 dump、内存 dump 等信息建立一个快照,可以将快照发送开发者处进行 bug 反馈