JDK Mission Control
TIPS
- 本文基于JDK Mission Control 7.0.1编写
- 不同版本的JDK Mission Control特性、功能甚至界面都可能不同,因此建议使用和笔者相同的版本测试(例如7.0.1版本的界面和JDK 8内置的JMC 5.5界面简直不像是一个软件)
- 有关商业授权的说明:
- JMC曾经是一款商业授权工具(例如在JDK 8中),需要商业授权才能在生产环境中使用。但根据Oracle Binary Code协议,在个人开发环境中可以免费使用。
- 现已开源,在JDK 11(哪怕是OpenJDK)中,任何人都可以使用JFR + JMC(需遵循 UPL协议 )!
- 本文只调研了JDK的长期支持版本JDK 8/JDK 11的商业授权规则,没有去细究短期支持版本JDK 9、10等短期支持版本的商业授权规则(主要是生产环境应该没人敢用短期支持的JDK版本)。
JDK Mission Control也叫Java Mission Control,简称JMC。
JMC的两大功能:
- 作为JMX控制台,监控虚拟机MBean提供的数据
- 可持续收集数据的JFR(Java Flight Recorder),并可作为JFR的可视化分析工具
在正式探讨JMC之前,有必要先聊下JFR。
JFR(Java Flight Recorder)是一种用于收集有关运行中的Java应用的诊断信息和性能数据的工具。它几乎没有性能开销,因此,即使在负载很大的生产环境中也可以使用。JFR主要用于以下场景:
- 性能分析JFR可连续捕获应用的信息。比如执行概要分析(显示程序花费时间的地方),线程停顿/等待时间概要分析(显示线程为什么不运行的原因),分配概要分析(显示分配压力的位置),垃圾回收详细信息等
- 黑盒分析由于JFR开销非常低,因此可持续打开Flight Recorder,让JFR将信息保存到缓存区,然后在稍后再去分析这块数据,定位特定异常的原因
支持与调试联系Oracle支持人员寻求帮助时,JFR收集到的数据可能至关重要
安装JMC
对于JDK 10及更低版本
对于JDK 10及更低版本,JDK内置了JMC,使用如下命令启动:
jmc
TIPS
笔者测试,发现JDK 8中内置的JMC在macOS下无法正常启动,这是由于JAR包冲突导致的。解决方案有两种:参照 https://stackoverflow.com/questions/48400346/java-mission-control-from-jdk-1-8-0-161-frozen-upon-startup-on-mac-os-x 的说明,替换JAR包并重启。
-
对于JDK 11及更高版本
TIPS
此方式也同样适用于JDK 8
JMC独立出来并开源了,既可以下载独立软件,也可作为Eclipse的插件存在。但不管哪种方式,都需要手动下载。JMC相关地址: - 开源的Wiki:https://wiki.openjdk.java.net/display/jmc/Main
- Oracle侧有关JMC的官方网站:https://www.oracle.com/technetwork/java/javaseproducts/mission-control/index.htmlTIPS:这里面有个视频介绍资料,讲得挺好的,不过使用的版本有点老了
Oracle侧有关JMC的官方文档:https://docs.oracle.com/javacomponents/index.html
下载
前往 https://jdk.java.net/jmc/ 根据造自己的操作系统下载即可。这里提供百度盘加速下载地址,里面Linux、macOS、Windows都提供了:链接:https://pan.baidu.com/s/1HXjzNDpzin6fXGrZPyQeWQ 密码:aon2 1 代码块
下载完成后,参照 https://www.oracle.com/technetwork/java/javase/jmc-install-6415206.html 的说明安装即可,里面包含了JMC在操作系统、在各种场景下的安装。
使用JMC + JFR
如果想监控的应用所使用的JDK版本 < JDK 11
在启动你想监控的应用时,需添加如下参数:
-XX:+UnlockCommercialFeatures -XX:+FlightRecorder
其中:
- UnlockCommercialFeatures:解锁商业特性
- FlightRecorder:为应用启用或停用JFR(JDK 8u40开始,省略)
- 然后使用JMC连接该应用即可监控该应用
此外,还有其他相关参数可参考:https://docs.oracle.com/javacomponents/jmc-5-5/jfr-command-reference/command-line-options.htm
如果想监控的应用所使用的JDK版本 >= JDK 11
- 被监控的应用无需设置JVM参数,直接启动即可。
-
功能说明
JMX
概览:各种概要信息
- MBean浏览器:展示应用被JMX管理的Bean
- 触发器:配置触发规则,当规则满足时,就触发某个操作(在操作一栏配置)
- 系统:查看系统相关信息
- 内存:查看内存相关信息
- 线程:查看线程相关信息
-
JFR
自动分析结果:JMC自动给出的优化提议
- Java应用程序:展示应用的各种执行情况
- JVM内部:展示JVM层面的执行情况
- 环境:展示操作系统层面的执行情况
- 事件:展示录制期间发生的事件
TIPS
各项指标的含义详见:JMC - 帮助 - JDK Mission Control帮助
插件
-
JMC特点
优点:JMC的主要优点在于对JFR的支持
JFR在生产环境中对吞吐量的影响一般不会高于1%
- JFR监控过程是可动态的,无需重启
- JFR监控过程对应用完全透明,无需修改应用的代码,也无需安装额外的插件或代理
- JFR提供的数据质量非常高,对监控、排查的参考价值更大
缺点:
- JFR并不完全向后兼容。比如,在JDK 11里面生成的JFR文件,用早期的JMC(例如JMC 5.5)无法打开;
JMC 7.0.1无法分析堆dump文件(hprof格式),但 官方Wiki 宣称支持分析堆dump文件
参考文档
- JMC常见问题
- https://dzone.com/articles/using-java-flight-recorder-with-openjdk-11-1