JMC(Java Mission Control)是 Java 虚拟机平台上的性能监控工具,与虚拟机之间同样采用 JMX 协议进行通信,它跟随 JDK 7 一起发布,但后来又从 JDK 11 中被移除出去了。此外,它还可以配合 JFR(Java Flight Recorder)技术以极低的开销,收集和分析 JVM 底层的 Profiling 和事件等信息,并且不会影响虚拟机的优化。因此它非常适用于生产环境下满负荷运行的 Java 程序。

使用说明

image.png
启动后 JMC 的主界面如下图所示:
image.png
在左侧的 “JVM 浏览器” 面板中自动显示了通过 JDP 协议(Java Discovery Protocol)找到的本机正在运行的 HotSpot 虚拟机进程,如果需要监控其他服务器上的虚拟机,可在 “文件->连接” 菜单中创建远程连接。

1. JFR

把 “JVM 浏览器” 面板中的进程展开后,可以看到每个进程的数据都有 MBean 和 JFR 这两个数据来源。关于 MBean 这部分数据,与 JConsole 和 VisualVM 上取到的内容是一样的,只是展示形式上有些差别,这里就不再重复了。双击 “飞行记录器” 将会出现 “启动飞行记录” 窗口,如下图所示。
image.png
在启动飞行记录时,可以进行记录时间、垃圾收集器、编译器、方法采样、线程记录、异常记录、网络和文件 I/O、事件记录等选项和频率设定。点击 “完成” 按钮后马上就会开始记录,记录时间结束以后会生成飞行记录报告,如下图所示:
image.png
飞行记录报告里包含了以下几类信息:

  • 一般信息:关于虚拟机、操作系统和记录的一般信息。
  • 内存:关于内存管理和垃圾收集的信息。
  • 代码:关于方法、异常错误、编译和类加载的信息。
  • 线程:关于应用程序中线程和锁的信息。
  • I/O:关于文件和套接字输入、输出的信息。
  • 系统:关于正在运行 Java 虚拟机的系统、进程和环境变量的信息。
  • 事件:关于记录中的事件类型的信息,可以根据线程或堆栈跟踪,按照日志或图形的格式查看。

JFR 的基本工作逻辑是开启一系列事件的录制动作,当某个事件发生时,这个事件的所有上下文数据将会以循环日志的形式被保存至内存或者指定的某个文件当中,循环日志相当于数据流被保留在一个环形缓存中,所以只有最近发生的事件的数据才是可用的。JMC 从虚拟机内存或者文件中读取并展示这些事件数据,并通过这些数据进行性能分析。

即使不考虑对被测试程序性能影响方面的优势,JFR 提供的数据质量通常也要比其他工具通过代理形式采样获得或者从 MBean 中取得的数据高得多。以垃圾收集为例,HotSpot 的 MBean 中一般有各个分代大小、收集次数、时间、占用率等数据,这些都属于结果类的信息,而 JFR 中还可以看到内存中这段时间分配了哪些对象、哪些在 TLAB 中分配、分配速率和压力大小如何、分配归属的线程、收集时对象分代晋升的情况等,这些就是属于过程类的信息,对排查问题的价值是难以估量的。