如何使用 Java Mission Control 监控 Java 应用程序

x33g5p2x  于2022-09-14 转载在 Java  
字(3.1k)|赞(0)|评价(0)|浏览(1425)

这篇文章主要介绍Java Flight Recorder(JFR)和 Java Mission Control (JMC)组件。在本文结束时,你将能够监控、收集诊断数据并对任何正在运行的Java应用程序进行剖析。

什么是 Java Flight Recorder?

首先,为什么我们需要另一个工具来监控 Java ?事实上,已经有几个选项可用于监控 Java 应用程序。你们中的许多人已经了解 VisualVM(请参阅本文了解更多信息:使用 VisualVM 监控 WildFly)和 JConsole(使用 JConsole 监控远程 WildFly 服务器)。

JDK Flight Recorder 是 Java 虚拟机 (JVM) 代码中附带的性能/诊断工具。以前作为 JRockit 的商业功能提供,您现在可以在常见的 OpenJDK 发行版中运行它,例如 OpenJDK 11。

使用 JFR 与 VisualVM/JConsole 相比有什么优势?

在某种程度上,Java Flight Recorder 类似于 VisuaVM 或 JConsole 等典型的 Java 分析器。不过也有一些优势。

  • JFR 附带一个连贯且更丰富的数据模型,可以更轻松地交叉引用/过滤诊断事件。
  • 您可以与您的支持团队共享来自 JFR 的信息,以提供您的应用程序数据的统一视图。这可能相当于您提供给支持团队的sosreport(在操作系统方面)。
  • JFR 的数据收集引擎很好地集成到 HotSpot JVM 中,这意味着 JFR 收集数据的开销会更少。另一方面,VisualVM 或 JConsole 使用外部 API/MXBeans 来收集数据。

如何启用 JFR

激活 Java Flight Recorder 的最简单方法是在启动时添加 JVM 选项 -XX:StartFlightRecording。例如,如果你想把它添加到 WildFly 应用服务器或 JBoss EAP,在 standalone.conf 文件中包含这个选项:

JAVA_OPTS="$JAVA_OPTS -XX:StartFlightRecording=duration=200s,filename=record.jfr"

在上面的命令中,我们在文件 record.jfr 中记录了 200 秒的数据。

另一方面,您也可以使用 jcmd 工具在正在运行的 Java 进程上激活 JFR 工具。除了进程 ID (PID) 之外,您还需要提供要执行的操作。

要开始飞行记录,请使用 JFR.start 诊断命令。例如,以下命令启动名为 monitor2hour 的记录,该记录最多保留 2 小时的数据,并将记录的大小限制为 250 兆字节。

$ jcmd pid JFR.start name=monitor2hour maxage=2h maxsize=250M

要在飞行记录运行时将数据写入文件,请使用 JFR.dump 诊断命令,如下所示:。

$ jcmd pid JFR.dump name=monitor2hour filename=monitor-dump.jfr

最后,使用 JFR.stop 命令停止记录诊断数据:

$ jcmd pid JFR.stop name=monitor2hour filename=debugrun1.jfr
如何使用 JBang 启用Java Flight Recorder

JBang 是一个用于创建、编辑和运行自包含源 Java 程序的工具。您可以在此处阅读更多相关信息:JBang:像专业人士一样创建 Java 脚本

您可以在 JBang 脚本上应用 Flight Recorder,如下所示:

jbang --jfr application.java

默认情况下 –jfr 将启动飞行记录器转储事件记录到文件 application.jfr(因此使用脚本的基本名称作为其文件名)。

如何使用 Java Mission Control (JMC) 查看数据

到目前为止,我们使用 **Java Flight Recorder 获得了记录器诊断数据。接下来,我们需要检查这些数据。为此,您可以使用 Java Mission Control Tool (JMC),它是一套用于 OpenJDK/Oracle JDK 的工具。

可以在 github 上找到 JMC 项目:https://github.com/openjdk/jmc

另一方面,一些操作系统(例如 RHEL 8)提供 jmc 工具作为其模块流的一部分。 JMC 还包含在适用于 Windows 的 OpenJDK 开发人员构建中。在本文中,我将通过三个简单的步骤向您展示如何在 Fedora 机器上安装 JMC

// enable the copr repo
$ dnf copr enable almac/jmc8

// install jmc
$ sudo dnf install jmc

然后启动 jmc 命令以启动 Java Mission Control:

jmc

一旦开始,选择文件|打开文件 打开您的 JFR 文件。第一站是 Automated Analysis Results,其中包含每个问题(0 到 100)的 score 检测到的主要问题列表:

从这个角度来看,几个问题已经很明显了:

  • 线程分配:同一线程执行的许多分配可能表明多线程程序中存在问题。查看分配率最高的线程的堆栈跟踪。
  • 分配的类。尝试减少垃圾回收时,频繁分配的类型是很好的起点。查看最常见类型的分配位置,以查看是否沿同一调用路径创建了许多实例。
  • TLAB 分配率:程序在 TLAB 之外分配了 98.9% 的内存。在线程局部分配缓冲区 (TLAB) 之外分配对象比在 TLAB 内部分配更昂贵。

这些热点将在 Java 应用程序树中突出显示(带有橙色的“i”图标)。

Java 任务控制资源树

JMC 用户界面的左侧包含一组指标,这些指标分为三个主要类别:

  • Java 应用程序:此分支与您的应用程序直接相关。从这里您可以查明应用程序线程、分析方法、探索异常和文件或套接字 I/O
  • JVM Internals:此分支包含用于垃圾收集分析、编译和类加载、VM 操作和 TLAB 分配的有用资源。
  • Environment:最后一个分支是您到 OS Environment 的链接。捕获进程、环境变量、系统属性和本机库。

让我们更详细地了解 Java 应用程序 分支。

Java 应用程序内部

Java 应用程序 树视图中,您将找到所有区域的子集,包括线程、内存、锁实例、文件 I/O、套接字 I/O、方法分析、异常和线程转储。

如前所述,具有异常数据的子集显示 (i) 橙色图标。例如,Memory 元素显示了明显的内存使用问题(内存泄漏)。在 Stack Trace 下部选项卡中,您将能够指向有问题的方法:

另一个常见的分析元素是方法分析:它会告诉你热点在你的应用程序方法中的位置。例如,如果您遇到 CPU 密集型问题,方法分析信息将告诉您在哪里进行优化以使事情进展得更快。

在此 UI 的下部,您将找到每个事件的 Stack Trace 和 Flame View

Flame View 提供更快的理解并缩短根本原因分析的时间。以下是如何阅读它:

  • 此视图中的每个框代表一个方法调用。
  • x 轴显示堆栈跟踪集合,y 轴显示堆栈深度。
  • 方框的宽度表示函数出现的频率。更宽的框意味着更多的出现..
  • 最后,搜索字段可帮助您搜索特定术语,其中可以包括正则表达式。

然后,如果您的应用程序抛出大量 Exceptions,请切换到 Exceptions 视图。这将为您提供有关记录期间引发的异常数量以及它们的堆栈跟踪和详细信息的统计信息。浏览“概览”选项卡并检查您是否看到:

  • 任何意外的异常
  • 意外数量的预期异常

结论

本文是对 Java Flight RecorderJava Mission Control 进行了介绍,它允许从任何角度监视和分析任何类型的 Java 应用程序。在下一篇文章中,我们将学习如何从 Eclipse 启动 Java Mission control。

相关文章