第 4 章 虚拟机性能监控、故障处理工具

felix.shao2025-02-16

第 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 基础脚本工具总结open in new window

4.3 可视化故障处理工具

 略,目前为止用 MAT 比较多,后续可以再了解下其他工具。

4.3.1 JHSDB: 基于服务性代理的调试工具

 略。

4.3.2 JConsole: Java 监视与管理控制台

 略。

4.3.3 VisualVM: 多合-故障处理工具

 略。

4.3.4 Java Mission Control: 可持续在线的监控工具

 略。

4.4 HotSpot 虚拟机插件及工具

Last Updated 2/16/2025, 4:13:06 PM