第四章 虚拟机性能监控与故障处理王具*
4.1 概述
给一个系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。这里说的数据包括: 运行日志、异常堆械、GC 日志、线程快照(threaddump/javacore 文件)、堆转储快照( heapdump/hprof 文件)等。使用适当的虚拟机监控和分析的工具可以加快我们分析数据、定位解决问题的速度。
4.2 JDK 的命令行工具
JDK 主要命令行监控工具的用途。
-
jps :虚拟机进程状况工具
jps ( JVM Process Status Tool ),除了名字像UNIX 的ps 命令之外, 它的功能也和ps 命令类似:可以列出正在运行的虚拟机进程,并显示虚拟机执行主类( Main Class,main() 函数所在的类)名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID)。
jsp 命令格式:
jps [ options ] [ hostid ]
jps 命令的-v 参数可以查看虚拟机启动时显式指定的参数列表。
-
jstat :虚拟机统计信患监视工具
jstat ( JVM Statistics Monitoring Tool )是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT 编译等运行数据,在没有GUI 图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。
jstat 命令格式为:
jstat [ option vmid [interval[s|ms] [count]] ]
如果是本地虚拟机进程,VMID 与LVMID 是一致的,如果是远程虚拟机进程,那VMID 的格式应当是:
[protocol:][//]lvmid[@hostname[:port]/servername]
参数 interval 和count 代表查询问隔和次数,如果省略这两个参数,说明只查询一次。
选项option 代表着用户希望查询的虚拟机信息,主要分为3 类: 类装载、垃圾收集、运行期编译状况,具体如下:
-
jinfo: Java 配置信息工具
jinfo (Configuration Info for Java )的作用是实时地查看和调整虚拟机各项参数。使用jinfo 的-flag 选项查询未被显式指定的参数的系统默认值(和 jps -v 命令不同)。jinfo 还可以使用 -sysprops 选项把虚拟机进程的System.getProperties()的内容打印出来。
若JDK >= 1.6 ,可以使用java -XX:+PrintFlagsFinal 查看参数默认值。
jinfo 命令格式:
jinfo [ option ] pid
-
jmap: Java 内存映像工具
jmap (Memory Map for Java)命令用于生成堆转储快照(一般称为 heapdump 或 dump文件)。或者使用虚拟机参数
-XX:+HeapDumpOnOutOfMemoryError
可以让虚拟机在 OOM 异常出现之后自动生成dump 文件。使用参数-XX:+HeapDumpOnCtrlBreak
使用 [Ctrl]+[Break]快捷键让虚拟机生成dump 文件,或在Linux 系统下通过Kill -3 命令发送进程退出信号,也能拿到dump 文件(但程序不退出,只发出信号)。 jmap 的作用并不仅仅是为了获取dump 文件,它还可以查询finalize 执行队列、Java 堆和永久代的详细信息,如空间使用率、当前用的是哪种收集器等。
jmap 命令格式:
jmap [ option ] vmid
-
jhat :虚拟机堆转储快照分析工具
jhat (NM Heap An alysis Tool )命令,用来分析jmap 生成的堆转储快照。jhat 内置了一个微型的HTTP/HTML 服务器,生成dump 文件的分析结果后,可以在浏览器中查看。(一般都不用)
-
jstack: Java 堆核跟踪工具
jstack ( Stack Trace for Java )命令用于生成虚拟机当前时刻的线程快照( 一般称为 threaddump 或者javacore 文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆械的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。
jstack 命令格式:
jstack [ option ] vmid
-
HSDIS: JIT 生成代码反汇编
HSDIS 是一个Sun 官方推荐的Hotspot 虚拟机丑T 编译代码的反汇编插件,它包含在HotSpot 虚拟机的源码之中,但没有提供编译后的程序。它的作用是让HotSpot 的 -XX:+PrintAssembly 指令调用它来把动态生成的本地代码还原为汇编代码输出,同时还生成了大量非常有价值的注释,这样我们就可以通过输出的代码来分析问题。
4.3 JDK 的可视化工具
JDK 中除了提供大量的命令行工具外,还有两个功能强大的可视化工具: JConsole 和VisualVM ,这两个工具是JDK 的正式成员。
-
JConsole: Java 监视与管理控制台
JConsole CJava Monitoring and Management Console )是一种基于JMX 的可视化监视、管理工具。它管理部分的功能是针对JMX MBean 进行管理,
主要功能:
- 内存监控:“内存”页签相当于可视化的jstat 命令,用于监视受收集器管理的虚拟机内存Oava 堆和永久代)的变化趋势。
- 线程监控:“线程” 页签的功能相当于可视化的jstack 命令,遇到线程停顿时可以使用这个页签进行监控分析。
-
VisualVM :多台一放障处理工具
VisualVM (All-in-One Java Troubleshooting Tool) 是到目前为止随JDK 发布的功能最强大的运行监视和故障处理程序,它除了运行监视、故障处理外,还提供了很多其他方面的功能、如性能分析( Profiling)等。
VisualVM 基于NetBeans 平台开发,因此它一开始就具备了插件扩展功能的特性,因此其功能有:
- 显示虚拟机进程以及进程的配置、环境信息(jps 、jinfo ) 。
- 监视应用程序的CPU 、GC 、堆、方法区以及线程的信息(jstat 、jstack ) 。
- dump 以及分析堆转储快照(jmap 、jhat ) 。
- 方法级的程序运行性能分析,找出被调用最多、运行时间最长的方法。
- 离线程序快照:收集程序的运行时配置、线程dump 、内存dump 等信息建立一个快照,可以将快照发送开发者处进行Bug 反馈。
- 其他plugins 的无限的可能性……
VisualVM 在JDK 1.6 update 7 中才首次出现,但并不意味着它只能监控运行于JDK 1.6 上的程序,它具备很强的向下兼容能力,但并非所有功能都能完美地向下兼容,主要特性的兼容性。
评论区