一、历史

在 Oracle 收购 Sun之前,Oracle 的 JRockit虚拟机提供了一款叫做JRockitMission Control 的虚拟机诊断工具。

在Oracle收购Sun之后,Oracle公司同时拥有了Sun Hotspot和3Rockit两款虚拟机。根据Oracle对于Java的战略,在今后的发展中,会将JRockit的优秀特性移植到Hotspot上。其中,一个重要的改进就是在Sun的JDK中加入了JRockit的支持。

在Oracle JDK 7u40之后,Mission Control这款工具已经绑定在Oracle JDK中发布。

自Java 11开始,本节介绍的JFR已经开源。但在之前的Java版本,JFR属于
Commercial Feature,需要通过Java 虚拟机参数-XX:+UnlockCommercialFeatures开启

如果你有兴趣请可以查看openJDK的Mission Control项目。
https://github.com/JDKMissionControl/jmc

二、启动

Mission Control位于%JAVA_HOME%/ bin/jmc.exe,打开这款软件。
image.png
image.png

三、概述

java Mission Control(简称JMC) ,Java官方提供的性能强劲的工具。是一个用于对ava应用程序进行管理、监视、概要分析和故障排除的工具套件。
它包含一个GUI客户端,以及众多用来收集 Java 虚拟机性能数据的插件,如JMX
Console(能够访问用来存放虚拟机各个子系统运行数据的MXBeans),以及虚拟机内置的高效profiling工具Java Flight Recorder ( JFR)。

JMC的另一个优点就是:采用取样,而不是传统的代码植入技术,对应用性能的影响非常非常小,完全可以开着JMC来做压测(唯一影响可能是 full gc多了)。

四、功能:实时监控JVM运行的状态

如果是远程服务器,使用前要开JMX。
-Dcom.sun.management.jmxremote.port=${YOUR PORT}
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun .management.jmxremote.ssl=false
-Djava.rmi.server.hostname=${YOUR HOST/IP}

文件->连接->创建新连接,填入上面JMX参数的 host和 port
image.png

五、Java Flight Recorder

java Flight Recorder是 MC的其中一个组件。

Java Flight Recorder能够以极低的性能开销收集Java虚拟机的性能数据。

JFR的性能开销很小,在默认配置下平均低于1%。与其他工具相比,JFR能够直接访问虚拟机内的数据,并且不会影响虚拟机的优化。因此,它非常适用于生产环境下满负荷运行的Java程序。

Java Flight Recorder和DK Mission Control共同创建了一个完整的工具链。JDK
Mission Control可对Java Flight Recorder连续收集低水平和详细的运行时信息进行高效,详细的分析。

5.1、事件类型

当启用时,JFR将记录运行过程中发生的一系列事件。其中包括 Java层面的事件,如线程事件、锁事件,以及Java 虚拟机内部的事件,如新建对象、垃圾回收和即时编译事件。
按照发生时机以及持续时间来划分,JFR的事件共有四种类型,它们分别为以下四种。
1.瞬时事件(Instant Event),用户关心的是它们发生与否,例如异常、线程启动事件。
2.持续事件(Duration Event),用户关心的是它们的持续时间,例如垃圾回收事件。
3.计时事件(Timed Event),是时长超出指定阙值的持续事件。
4.取样事件( Sample Event),是周期性取样的事件。
取样事件的其中一个常见例子便是方法抽样(Method Sampling),即每隔一段时间统计各个线程的栈轨迹。如果在这些抽样取得的栈轨迹中存在一个反复出现的方法,那么我们可以推测该方法是热点方法。

5.2、启动方式

5.3、取样分析

要采用取样,必须先添加参数:

  • -XX:+UnlockCommercialFeatures
  • -XX:+FlightRecorder

否则:
image.png
取样时间默认1分钟,可自行按需调整,事件设置选为 profiling,然后可以设置取样profile哪些信息,比如:

  • 加上对象数量的统计: Java Virtual Machine -> Gc -> Detailed -> objectCount/object Count after GC
  • 方法调用采样的间隔从10ms改为1ms(但不能低于1ms,否则会影响性能了): JavaVirtual Machine -> Profiling -> Method Profiling Sample/Method Sampling Information
  • Socket 与 File采样,10ms太久,但即使改为 1ms也未必能抓住什么,可以干脆取消掉: Java Application->File Read/Filewrite/Socket Read/Socket write