第 4 章 虚拟机性能监控、故障处理工具
第 4 章 虚拟机性能监控、故障处理工具
4.1 概述
4.2 基础故障处理工具
工具主要选项略。
4.2.1 jps: 虚拟机进程状态工具
功能和 ps 命令类似,可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一 ID。
使用示例:jps
。
4.2.2 jstat: 虚拟机统计信息监视工具
用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机中的类加载、内存、垃圾收集、即时编译等运行时数据,在没有 GUI 图形界面、只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的常用工具。
使用示例:jstat -gc pid 250 20
。解析:查询 pid 进行的 Java 堆情况,每 250 毫秒查询一次,一共查询 20 次。
4.2.3 jinfo: Java 配置信息工具
实时查看和调整虚拟机各项参数。使用 jps 命令的 -v 参数可以查看虚拟机启动时显式指定的参数列表。但如果想知道未被显示指定的参数的系统默认值,除了去找资料外,就只能使用 jinfo 的 -flag 选项进行查询了。-sysprops 选项可以把虚拟机进程的 System.GetProperties() 的内容打印出来。
使用示例:jinfo -flag CMSInitiatingOccupancyFraction pid
。
4.2.4 jmap: Java 内存映像工具
用于生成堆转储快照文件。
还可以通过一些比较暴力的手段获取堆转储快照文件。如 -XX:+HeapDumpOnOutOfMemoryError
参数,可以让虚拟机在内存溢出出现之后自动生成堆转储快照文件;通过 -XX:+HeapDumpOnCtrlBreak
参数则可以使用 [Ctrl]+[Break] 键让虚拟机生成堆转储快照文件,又或者在 Linux 系统下通过 Kill -3 命令发送进程退出信号 “恐吓” 一下虚拟机,也能顺利拿到堆转储快照。
jmap 还可以查询 finalize 执行队列、Java 堆和方法区的详细信息,如空间使用率、当前用的是哪种收集器等。
使用示例:jamp -dump:format=b, file=file.dump pid
。
4.2.5 jhat: 虚拟机堆转储快照分析工具
JDK 提供 jhat 命令与 jmap 搭配使用,来分析 jmap 生成的堆转储快照。但是一般都没有使用 jhat,主要原因如下。
- 一般不会在部署应用程序的服务器上直接分析堆转储快照,因为分析工作是一个耗时而且几位耗费硬件资源的过程。
- jhat 对比 MAT、VisualVM 等工具,分析功能比较简陋。
4.2.6 jstack: Java 堆栈跟踪工具
用于生成虚拟机当前时刻的线程快照(一般称为 threaddump 或者 javacore 文件)。
线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的目的通常是定位线程长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间挂起等。
线程出现停顿时通过 jstack 来查看各个线程的调用堆栈,就可以获知没有响应的线程到底在后台做些什么事情,或者等待着什么资源。
使用示例:jstack -l pid
。
4.2.7 基础工具总结
参考 JDK 基础脚本工具总结
4.3 可视化故障处理工具
略,目前为止用 MAT 比较多,后续可以再了解下其他工具。
4.3.1 JHSDB: 基于服务性代理的调试工具
略。
4.3.2 JConsole: Java 监视与管理控制台
略。
4.3.3 VisualVM: 多合-故障处理工具
略。
4.3.4 Java Mission Control: 可持续在线的监控工具
略。