jmc:Java Mission Control
使用 JMC可以监视和管理 Java 应用程序,不会导致相关工具类的大幅度性能开销,它使用为 Java 虚拟机 (JVM) 的普通自适应动态优化收集的数据。
主要部分
-
JVM浏览器:显示了正在运行的 Java 应用程序及其 JVM,每个JVM实例称为一个JVM连接。JVM浏览器允许用户列出并连接到本地和远程运行的 Java 应用。它能够使用 Java 发现协议(JDP)自动地发现本地和远程运行的 Java 进程。
-
JMX 控制台:能够通过 JMX 接口管理并监控 JDK ,实时收集并显示其特征。它提供了实时集合、堆使用情况、CPU 负载以及其他通过 MBeans 暴露的和在 MBean 服务器中注册的信息,并可通过托管 Bean (MBean) 更改一些运行时属性。还可以创建在特定事件上触发的规则 (例如,如果应用程序的 CPU 占用率达到了 90%,则发送电子邮件)。
-
JFR:提供了一种从操作系统层、JVM 和 Java 应用程序层收集事件的方式。收集的事件包括线程延时事件,例如休眠(sleep)、等待(wait)、锁竞争、I/O、GC 和方法分析。
Java Mission Control 插件使用 Java Management Extensions (JMX) 代理连接到 JVM
启动JMC后,连接某个本地应用后,出现如下界面:

远程连接JVM(通过JMX连接如果想要用jmc监控远程的JVM进程,配置方式和jvisualvm方式一一样即可)
本地连接比较简单这里就不在赘述,远程连接JVM,这里利用VMWare工具进行模拟,过程中遇到一些问题,值得注意的。
首先,远程机器被监控的程序需要开启调试端口,在执行java命令行中加入以下属性,属性没有以ssl安全认证方式连接的,案例中启动监听端口为7091
JMX配置(被监控的远程Tomcat)
进入tomcat安装目录安装找到catalina.sh文件,在CATALINA_OPTS中增加一下配置:
-Dcom.sun.management.jmxremote=true
-Djava.rmi.server.hostname=115.29.206.6
-Dcom.sun.management.jmxremote.port=6666
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.managementote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-XX:+UnlockCommercialFeatures -XX:+FlightRecorder
配置成功之后我的CATALINA_OPTS为:
CATALINA_OPTS="-Xms1024m -Xmx6144m -XX:+HeapDumpOnOutOfMemoryError
-XX:+PrintGCDetails -XX:+PrintGCDateStamps
-Dspring.profiles.active=production
-Xloggc:/data/logs/gc-`date +"%Y-%m-%d_%H%M%S"`.log
-XX:MaxPermSize=1024M
-Dcom.sun.management.jmxremote=true
-Djava.rmi.server.hostname=115.29.206.6
-Dcom.sun.management.jmxremote.port=6666
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.managementote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-XX:+UnlockCommercialFeatures -XX:+FlightRecorder"
主要配置项说明:
-
-Djava.rmi.server.hostname=115.29.206.6
:这个配置的值是远程tomcat服务器的外网ip。 -
-Dcom.sun.management.jmxremote.port=6666
:这个是对外开放的端口,后面在配置客户端的时候需要用到这个。

创建完成后双击MBean或者右键–>打开JMX控制台,均能打开控制台

展示面板
概览
默认布局提供 CPU 和内存使用情况的概览。
概览:可以添加自定义图表,通过概览的加号”添加图表”实现;可以重置,通过”重置为默认控件”实现。
添加图表后,可以通过图表的加号添加相应的子项,并可以在图表上右键详细设置(如下图中的Test)

MBean浏览器
JMC使用托管Bean (MBean) 为监视和管理 Java 应用程序性能提供统一且一致的界面。MBean 是采用符合 JMX 规范的设计模式的托管对象。MBean 可以表示一个设备、一个应用程序或需要托管的任何资源。MBean 的管理界面由一组属性、操作和通知组成。
MBean 浏览器提供对所有已注册 MBean 的访问。MBean 在管理服务器中注册,后者可以通过与 Java Management Extensions (JMX) 兼容的客户机访问

要创建和注册新 MBean,请单击 MBean 面板加号图标。执行此操作会启动动态创建和注册新的 MBean 向导,提示为新 MBean 输入对象名和类名。若要继续,对象名必须有效,并且类名必须是有效的 Java 类名。请注意,该向导不会验证类是否对 MBean 服务器可用;将只进行语法检查。要注销特定 MBean,右键单击并从上下文菜单中选择注销。

MBean功能
- 属性:列出所选 MBean 的属性。
- 操作:列出可从所选 MBean 调用的操作。
- 通知:列出在运行时期间 MBean 所提示的通知。
- 元数据:包含描述 MBean 的信息。
触发器
使用触发器选项卡可以管理满足特定条件时触发事件的规则。这是一种无需持续地监视应用程序即可跟踪运行时问题的有用方法。以灰色显示的规则在监视的 JVM 中不可用。默认情况下,停用所有规则。要激活某个规则,请选中该规则旁边的复选框

规则详细信息
- 条件:选择触发规则时所在的属性和值。
- 操作:选择应由规则触发的事件。
- 约束条件:选择激活规则时的时间约束条件。
创建触发器

设置触发规则的条件:
-
最大触发值:最大触发值(对于数值属性) 或匹配字符串 (对于非数值属性),指定用于触发规则的选定属性的最大值或匹配字符串。
-
持续时间:指定条件必须保持为“真”以触发规则的持续时间 (默认秒)。
-
限制时间段:指定可以接下来再次触发规则所要经过的最短时间长度 (默认秒)。
-
满足条件时触发:选择是否在满足条件时触发规则。例如,如果触发值设置为 100,则在值从小于 100 更改为 100 或更高值时触发规则。
-
从条件恢复时触发:选择是否当不再满足条件时触发规则。例如,如果触发值设置为 100,则在值从 100 或更高值更改为 100 时触发规则。

在规则触发时发生的操作
-
应用程序预警:在JMC中显示预警对话框。
-
控制台输出:将通知发送到启动 JMX 控制台的控制台 (命令提示) 的标准输出 (stdout)。
-
转储飞行记录:将最后指定时段 (秒) 的飞行记录中可用的全部数据转储到 JFR 文件。
-
HPROF 转储:启动到指定 HPROF 文件的内存转储。
-
调用诊断命令:调用指定的诊断命令,通过附加或覆盖结果将输出记录到指定的 LOG 文件。
-
记录到文件:将通知写入到指定的 TXT 日志文件。
-
发送电子邮件:通过电子邮件发送通知。可以配置 SMTP 服务器地址和端口、电子邮件的接收方和发送方并提供 SSL 身份证明 (如果需要安全连接)。
-
启动连续飞行记录:启动连续飞行记录。
-
启动限时飞行记录:启动飞行记录,在指定的时段之后将结果转储到 JFR 文件中。
系统
系统选项卡提供了运行 JVM 的系统的信息、JVM 的性能属性以及系统属性列表。

-
服务器信息
在系统选项卡顶部的服务器信息面板中,包含运行 JVM 的服务器的类别和值列表。这些信息对调试应用程序开发问题和运行时问题以及提出支持请求非常有用。这是一般系统信息,不能更改。 -
JVM 统计信息
JVM 统计信息面板包含 JVM 主要性能属性的当前值。默认情况下,表中显示以下属性: -
当前已加载类计数
运行时间
要向表中添加属性,请单击 JVM 统计信息面板右上角的添加属性按钮。要删除属性,请在表中右键单击该属性,然后选择删除。右键单击属性后,可以更改其更新间隔、单位,而对于一些属性,还可以设置值。
- 系统属性
系统属性面板包含一个表,其中列出使用 JVM 调用的所有属性的关键字和值。要筛选属性,请选择筛选列 (关键字或值),并在表上方的文本字段中指定筛选器字符串。
要配置表外观,请单击系统属性面板右上角的表设置按钮,然后选择要显示或隐藏的列。对于各列,可以设置最小宽度、比例和初始排序顺序。展示的是一般系统信息,不能更改。
内存
使用内存选项卡可以监视应用程序使用内存资源的效率。此选项卡主要提供以下方面的信息:堆使用量、垃圾收集和活动内存池。此选项卡上提供的信息可帮助确定是否已将 JVM 配置为提供最佳应用程序性能。

在内存选项卡中,可以使用该选项卡右上角的运行完全垃圾收集按钮手动启动完全垃圾收集。
- GC 表
GC 表面板包含可用垃圾收集器的主要性能属性的当前值。该面板分为标有活动垃圾收集器名称的多个选项卡 - 总收集时间
- 收集计数
- GC 开始时间
- GC 结束时间
- GC 持续时间
- GC ID
- GC 线程计数
右键单击属性后,可以更改其更新间隔、单位,而对于一些属性,还可以设置值。
-
活动内存池
活动内存池面板包含一个表,其中列出可供 JVM 使用的内存池的信息。默认情况下,该表包含以下列: -
池名称:内存池的名称。
-
类型:内存池的类型。如果内存池属于 Java 堆,则类型为 HEAP,否则为 NON_HEAP。
-
已用:当前已用的内存池大小。
-
最大值:内存池的最大大小。
-
占用率:当前使用量占最大内存池大小的百分比。
-
已用峰值:在受监视 JVM 的有效期内内存池已用内存的峰值。
-
最大值峰值:在受监视 JVM 的有效期内最大内存池大小的峰值。
线程
使用线程选项卡可以监视线程活动。此选项卡包含一个绘制应用程序随时间推移的活动线程使用情况的图形、一个由该应用程序使用的所有活动线程的表以及选定线程的堆栈跟踪。

-
活动线程图
活动线程图显示 Java 应用程序随时间推移启动的线程数。默认情况下,图形中显示以下属性:- 高峰活动线程计数
- 活动线程总计数
- 守护程序活动线程计数
-
活动线程
活动线程面板包含一个表,其中列出 Java 应用程序所启动活动线程的信息。默认情况下,该表包含以下列:- 线程名称:线程的名称。
- 线程状态:线程的状态。线程可以是以下状态之一:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING 或 TERMINATED。
- 受阻计数:线程处于 BLOCKED 状态的次数。
- CPU 总体占用率:线程所使用 CPU 资源占总 CPU 资源的百分比。默认情况下不提取此值。要启用它,请在表上方选择 CPU 概要分析。
- 死锁:线程是否已死锁。默认情况下不提取此值。要启用它,请在表上方选择死锁检测。
- 已分配的字节:已分配给线程的字节数。默认情况下不提取此值。要启用它,请在表上方选择分配。
实时监视最后三个值会消耗大量系统资源。这就是默认情况下禁用它们的原因。使用表上方相应的复选框,对这些值启用监视。
- 选定线程的堆栈跟踪
在活动线程表中选择线程后,其整个堆栈跟踪将显示在下面的选定线程的堆栈跟踪面板中。堆栈跟踪包含所有方法 (一直到当前执行的方法) 的调用路径。它非常有用,例如,当需要确定导致死锁或代码执行过程中意外中断的方法时。
可以使用 Ctrl 键在活动线程表中选择多个线程来显示多个堆栈跟踪。
诊断命令
使用诊断命令可监视 Java 应用程序的效率和性能。JMC 使用大量不同的诊断工具,包括一组可以使用诊断命令选项卡针对应用程序运行的命令。

运行 JMX 控制台监视 JVM 的额外成本很小,几乎可以忽略不计。它提供低成本的应用程序监视和概要分析 JMX标准参考
JFR:Java Flight Recorder
JFR 是 JMC 中一个非常关键的功能。是一个用于收集有关正在运行的 Java 应用程序的诊断数据和概要分析数据的工具。它记录了 JVM 所有事件的历史数据,通过这些数据,程序性能分析人员可以结合以往的历史数据对 JVM 性能瓶颈进行分析诊断。它集成到 Java 虚拟机 (JVM) 中,几乎不会带来性能开销,因此甚至可以在高负载生产环境中使用。使用默认设置时,内部测试和客户反馈表明性能影响低于 1%。对于一些应用程序,这一数字会大幅降低。但是,对于短时间运行的应用程序 (不是在生产环境中运行的应用程序类型),相对的启动和预热时间可能会较长,这对性能的影响可能会超过 1%。JFR 收集有关 JVM 及其上运行的 Java 应用程序的数据。
JFR 的基本操作是开启一系列的事件。当某个事件发生时,这个事件的所有数据将会被保存至内存或者一个文件当中。数据流被保留在一个环形缓存中,所以只有最近发生的事件的数据才是可用的。JMC 可以从 JVM 或者文件中读取并展示这些事件数据,通过这些数据,可以进行性能分析。
启用 Java 飞行记录器
默认情况下,在 JVM 中禁用了 JFR。要启用 JFR,必须使用 -XX:+FlightRecorder 选项启动 Java 应用程序。由于 JFR 是一种商业功能,仅在基于 Java 平台标准版 (Oracle Java SE Advanced 和 Oracle Java SE Suite) 的商业包中提供,因此还需要使用 -XX:+UnlockCommercialFeatures 选项来启用商业功能。(可以参阅在准备阶段配置中的配置)
使用命令行选项可以
java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder ……
请注意,在 JVM 上运行依赖于 lambda 表单的其他语言时 (如 JavaScript 实施 Nashorn),堆栈跟踪的深度会非常深。要确保对大堆栈的堆栈跟踪正确采样,可能需要增加飞行记录器的堆栈深度。通常将此值设置为 1024 便已足够:
java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:FlightRecorderOptions=stackdepth=1024 ……
JFR 具有以下优势
- 提供更好的数据:JFR 使用的相关数据模型使其易于交叉引用和过滤事件。
- 允许使用第三方事件提供程序:JFR 通过一组 API 监视第三方应用程序
- 降低总体成本:使用 JFR 可以缩短在诊断问题和排除问题方面所花的时间、减少运营成本和业务中断、在出现问题时能够更快地予以解决,并且可以提高系统效率。
JFR 使用场景
- 概要分析
JFR 连续保存有关正在运行的系统的大量数据。此概要分析信息包括线程样本 (其中显示程序在什么地方占用了时间)、锁概要文件以及垃圾收集详细信息。 - 黑匣子分析
JFR 将信息连续保存到循环缓冲区。可在检测到异常时评估此信息以查找原因。 - 支持和调试
在与 Oracle 技术支持联系以帮助诊断 Java 应用程序的问题时,JFR 收集的数据非常重要。
JFR展示的项目
飞行记录器插件在一系列选项卡和子选项卡中显示记录文件的信息,并带有包含表和图形的面板。选项卡排列在选项卡组中,这些选项卡组可合并有关 JVM 和 Java 应用程序运行时的特定方面的数据。

- 一般信息:关于 JVM、系统和记录的一般信息。
- 内存:关于内存管理和垃圾收集的信息。
- 代码:关于方法、异常错误、编译和类加载的信息。
- 线程:关于应用程序中线程和锁的信息。
- I/O:关于文件和套接字 I/O 的信息。
- 系统:关于正在运行 JVM 的系统、进程和环境变量的信息。
- 事件:关于记录中的事件类型的信息,可以根据线程或堆栈跟踪,按照日志或图形的格式查看,也可显示为直方图。
JFR一般信息
一般信息选项卡组显示有关 JVM、系统和记录的一般信息。
- 概览选项卡提供系统、JVM 和 Java 应用程序的高级视图:堆使用量、CPU 总体占用率、GC 暂停时间、CPU 占用率、堆使用量、jmv启动时间和jvm完成版本

-
提供有关 JVM 的一般信息
-
列出用于启动 JVM 的系统属性
-
记录选项卡提供有关记录、可在记录中使用的事件类型及其设置的信息
JFR内存
内存选项卡组显示有关内存管理和垃圾收集的信息
-
提供内存使用量和垃圾收集的高级视图
-
提供有关在记录时段内发生的垃圾收集活动的信息
-
显示有关在记录时段内发生的垃圾收集的运行时间以及这些垃圾收集导致的暂停时间的信息
-
有关垃圾收集器、Java 堆和年轻代的配置信息
-
有关线程本地分配缓冲区 (TLAB) 内外的已分配对象的数据
TLAB中的内存分配和TLAB外的内存分配事件。新TLAB分配提供了三种以上专供于分析新TLAB分配事件的虚拟化类型:类级、线程级和分析级的分配。分析级分配是对这三种类型的一个简单的栈追踪集合。TLAB外分配的内存标签页和新TLAB标签页的工作原理相同,仅仅在这个时间点是一致的。
限制:因为新TLAB的内存分配事件仅仅只是总的线程本地内存分配的样本,仅仅只有一个事件是很难说明实际情况的。更多的事件才会有更精确的图片。此外,如果分配事件的行为在记录期间变化非常大,那么这样也很难建立一个十分有说服力本地内存分配视图。
-
对象统计信息”选项卡提供有关占用 Java 堆超过 0.5% 的对象的信息
JFR代码
代码分析是Java性能分析重点,通过代码分析,可以清楚的知道系统运行时,哪些类及方法被高频率的调用
代码选项卡组包含有关方法、异常错误、编译和类加载的信息。该选项卡组用于分析与代码执行相关的 Java 应用程序的各个方面。如果 JVM 未生成任何 CPU 负载,线程通常处于等待状态,因此将不会在此选项卡组中获取大量有意义的统计信息。
-
提供 Java 应用程序中最常用的包和类的高级视图
-
提供有关 Java 应用程序中最常用的方法的信息
查看热点方法调用栈,可以了解到系统的主要计算资源消耗情况
-
显示所有采样的堆栈跟踪 (从 main() 和 run() 开始)。
以模块化的方式直观的看到系统运行状态,显示最常用的堆栈跟踪,这对于查找 Java 应用程序中的瓶颈非常有帮助;
-
显示有关由 Java 应用程序引发的错误和异常错误的信息
-
有关记录期间生成的代码的信息
-
有关记录期间加载和卸载的类的信息,以及有关每次加载和卸载的详细信息
JFR线程
线程选项卡组包含有关 Java 应用程序中的线程和锁的信息。可以得知CPU占用率的分布(系统占用率、应用程序+JVM占用率)和活动线程数,判断CPU占用率分布是否合理。
-
提供 CPU 负载和线程计数的高级视图
-
有关 JVM 最常使用的线程的信息,详细列出了热点线程的数量及详情
-
含有关锁、受阻线程和阻塞线程的信息。当存在性能问题但 CPU 负载不高时,某些线程可能被阻止。此选项卡对分析线程阻止问题和查找锁过多的根源非常有用

线程争用是解决应用性能比较关键的步骤,定位线程争用的情况,可发幅度提升性能有
-
关导致线程不执行 Java 代码 (线程停滞) 的事件的信息。可以查看线程休眠、等待、受阻等等所花费的时间
-
有关记录期间发生的线程转储的信息
-
有关 Java 应用程序中的锁定实例事件的信息
JFR I/O
I/O 选项卡组包含有关文件以及套接字读取和写入的信息。此选项卡组可用于分析 Java 应用程序处理的数据量。
提供文件以及套接字读取和写入的高级视图

有关在记录期间进行的文件读取操作的信息

有关记录期间进行的文件写入操作的信息

JFR系统
系统选项卡组包含配置,列出正在运行的进程和正在运行 JVM 和 Java 应用程序的系统上的环境变量。
有关正在运行 Java 应用程序的硬件和软件的信息

含一个表,其中列出记录期间正在系统中运行的所有进程

含一个表,其中列出启动 JVM 时操作系统中设置的环境变量的键值对

JFR事件
事件选项卡组包含有关记录期间收集的事件的信息。JFR 记录每个事件及其发生时间和与该事件关联的数据。JMC5.5共支持80多种事件。默认情况下,并没有开启所有事件类型的记录,将对性能影响较大的 6 种类型事件关闭,以此达到将 JFR 对应用程的影响降到 1%以内,对性能影响的大小由开启记录的事件的类型和数量有关。
-
概览
-
收集的事件的日志
事件标签组中的Log标签是查看每个单独事件的绝佳地址
-
显示各线程中的事件的时间表图形
-
展示启动所记录事件的线程
-
记录的事件的聚集堆栈跟踪
-
事件属性数据分布的文本表示形式
常用事件类型
事件类型 | JFR或其他工具获取 | 只能JFR获取 |
---|---|---|
Classloading | 被加载的类的数量和未被加载的类的数量 | 加载类的类加载器(classloader),加载一个类需要的时间 |
Thread statistics | 创建线程的数量、销毁线程的数量、线程快照(dump) | 阻塞指定线程的锁以及被指定锁阻塞的线程 |
Throwables | 应用程序实用的异常类 | 应用程序抛出的异常和错误的数量以及创建异常和错误的栈记录 |
TLAB allocation | 内存堆中已分配的数量、TLAB(Thread-Local Allocation Buffers)的大小 | 在内存对中指定对象的内存分配以及为这些对象分配内存的栈记录 |
File and socket I/O | 进行 I/O 消耗的时间 | 每一次读写调用的时间消耗,读写操作消耗时间过长的文件或套接字 |
Monitor blocked | 等待监控器的线程 | 阻塞某个线程的监控器、线程被阻塞的时间 |
Code cache | 代码缓存的大小以及内容 | 从代码缓存中移除的方法、代码缓存的配置 |
Code compilation | 哪些方法被编译,OSR 编译,编译耗时 | JFR 中没有额外的信息,但 JFR 总结了多个源文件的信息 |
Garbage collection | GC 的次数,包括每一个阶段的次数、每个代的大小 | JFR 中没有额外的信息,但 JFR 总结了来自多个工具的信息 |
Profiling | 检测分析和采样分析 | JFR 并不能获得分析器获得的丰富信息,但 JFR 提供了更高层次的概述 |
Java Mission Control 通信
HotSpot JVM 使用基于远程方法调用 (RMI) 连接器的Java Management Extensions (JMX)技术启用监视和管理功能。这也称为基于RMI的JMX或简称 JMXRMI。要配置连接,启动 JVM 时必须设置以下系统属性:
-
-Dcom.sun.management.jmxremote
此选项用于切换 JMXRMI 的使用。默认情况下启用该选项,因此无需设置该选项就可以使用 JVM 的监视功能。要为 JVM 禁用 JMXRMI,请指定 -Dcom.sun.management.jmxremote=false。 -
-Dcom.sun.management.jmxremote.authenticate
该选项用于切换对 JMXRMI 连接使用口令验证。默认情况下此选项是启用的。要为 JVM 禁用口令验证,请指定 -Dcom.sun.management.jmxremote.authenticate=false。
注意:禁用验证是不安全的。任何知道 (或猜中) JMX 端口号和主机名的远程用户都能够监视和控制 Java 应用程序和 VM。虽然开发时这是可接受的,但对于生产系统不建议这样设置。
-
-Dcom.sun.management.jmxremote.port
此选项用于设置 JMXRMI 连接的端口号。必须设置未使用的端口号才能启用 JVM 的监视和管理功能。 -
-Dcom.sun.management.jmxremote.ssl
此选项用于切换安全套接字层 Sockets Layer (SSL) 验证的使用。默认情况下启用该选项。要为 JVM 禁用 SSL 验证,请指定 -Dcom.sun.management.jmxremote.ssl=false。 -
更多配置信息 请移步
-
JFR需要JDK的商业证书,需要解锁JDK的商业特性,例如:
jcmd 1152 VM.unlock_commercial_features
- 可以直接使用命令行来启动JFR,例如:
jcmd 41250 JFR.start delay=10s duration=1m filename=/Users/cc/Desktop/log.jfr
参考:
https://blog.csdn.net/u010397519/article/details/95635459
网友评论