在 Red Hat build of OpenJDK 中使用 JDK Flight Recorder


Red Hat build of OpenJDK 11

Red Hat Customer Content Services

摘要

Red Hat build of OpenJDK 11 是 Red Hat Enterprise Linux 和 Microsoft Windows 上的红帽产品。将 JDK Flight Recorder 与 Red Hat build of OpenJDK 指南提供了 JDK Flight Recorder (JFR)和 JDK Mission Control (JMC)的概述,并解释了如何启动 JFR。

提供有关红帽构建的 OpenJDK 文档的反馈

要报告错误或改进文档,请登录到 Red Hat JIRA 帐户并提交问题。如果您没有 Red Hat Jira 帐户,则会提示您创建一个帐户。

流程

  1. 单击以下链接 以创建 ticket
  2. Summary 中输入问题的简短描述。
  3. Description 中提供问题或功能增强的详细描述。包括一个指向文档中问题的 URL。
  4. Submit 创建问题,并将问题路由到适当的文档团队。

使开源包含更多

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 的信息

第 1 章 JDK Flight Recorder 简介

JDK Flight Recorder (JFR)是监控和性能分析 Java 应用程序的低开销框架。如需更多信息,请参阅 JEP 328: Flight Recorder

您可以从源自 JVM 和应用程序代码的事件收集数据。然后,数据会在内存中写入。首先,到 thread-local 缓冲区,然后在清除到磁盘上的 JFR 文件(*.jfr)前提升到 fixed-size 全局环缓冲。其他应用程序可以使用这些文件进行分析。例如,JDK Mission Control (JMC)工具。

1.1. JDK Flight Recorder (JFR)组件

您可以使用 JFR 功能观察 JVM 内运行的事件,然后从这些观察到的事件收集到的数据创建记录。

以下列表详细介绍了密钥 JFR 功能:

记录
您可以管理系统记录。每个记录都有唯一的配置。您可以启动或停止记录,或者根据需要将其保存到磁盘。
事件

您可以使用事件或自定义事件来跟踪 Java 应用的数据和元数据,然后在 JFR 文件中从任一事件类型保存数据和元数据。您可以使用各种工具,如 Java Mission Control (JMC)、jcmd 等等,来查看和分析存储在 JFR 文件中的信息。

Java 虚拟机(JVM)具有许多持续添加的预先存在的事件。用户可使用 API 将自定义事件注入其应用程序中。

您可以在记录时启用或禁用任何事件,以通过提供事件配置来最小化开销。这些配置采用 xml 文档的形式,并称为 JFR 配置集(..jfc)。对于最常见的用例,红帽构建的 OpenJDK 附带以下两个配置集:

  • 默认 :默认配置集是一个低选项配置,可以安全地在生产环境中持续使用。通常,开销小于 1%。
  • 配置集配置集 是一个低选项配置,非常适合性能分析。通常,开销小于 2%。

1.2. 使用 JDK Flight Recorder 的好处

使用 JDK Flight Recorder (JFR)的一些主要优点是:

  • JFR 允许记录正在运行的 JVM。在生产环境中,最好在很难重启或重新构建应用程序时使用 JFR。
  • JFR 允许定义自定义事件和指标来监控。
  • JFR 内置在 JVM 中,以实现最低性能开销(大约 1%)。
  • JFR 使用一致的数据建模来提供更好的跨引用事件和数据过滤。
  • JFR 允许使用 API 监控第三方应用程序。
  • JFR 有助于通过以下方法降低所有权成本:

    • 花费较少的时间诊断。
    • 有助于对问题进行故障排除。
  • JFR 通过以下方法降低操作成本和业务中断:

    • 提供更快的解决时间。
    • 识别有助于提高系统效率的性能问题。

第 2 章 JDK Mission Control (JMC)简介.

JDK Mission Control (JMC)是一个工具集合,用于读取和分析 Java Flight Recorder (JFR)文件。JMC 包括图表 JFR 事件的详细视图和图表。使用 JFR 分析时,JMC 也由以下组件组成:

  • JMX Console MBean
  • 通过 flight 记录和 hprof 文件(JMC 7.1.0 起)的历史分析。
  • HPROF-dump analyzer

JMC 基于 Eclipse 平台。您可以使用 Eclipse RCP API 和其他特定 API 来扩展 JMC 来添加插件。

您可以在 Red Hat Enterprise Linux 上使用 JMC 及其插件 RHEL 或 Microsoft Windows。

对于 Red Hat Enterprise Linux,RHEL 9 的 CodeReady Linux Builder (CRB)存储库提供 JMC 软件包。

注意

CRB 存储库也称为 Builder 存储库。

您必须在 RHEL 9 中启用 CRB 存储库,以便在 RHEL 上安装 JMC。CRB 软件包使用 Source Red Hat Package Manager (SRPM)作为产品化的 RHEL 软件包构建,因此 CRB 软件包接收常规更新。

CRB 是一个在 RHEL 中禁用的开发人员存储库。CRB 包含由 RHEL 用户帐户提供的 buildroot root 文件系统的一部分。buildroot root 文件系统包含用于构建应用程序的开发人员级构建依赖项。

有关 CRB 存储库的更多信息,请参阅 CodeReady Linux Builder 存储库 (软件包清单)。

2.1. 下载并安装 JMC

Red Hat build of OpenJDK 发行版本用于 Red Hat Enterprise Linux 和 Microsoft Windows 包括一个 JMC 版本。

对于 Red Hat Enterprise Linux,您可以使用 Red Hat Subscription Manager 工具在本地操作系统中下载并安装 JMC。

在 Microsoft Windows 上,JMC 软件包包含在您可以从红帽客户门户网站下载的存档文件中。在 Microsoft Windows 上下载并安装红帽构建的 OpenJDK 11 后,您可以进入包含 jmc.exe 文件的目录,然后发出 jmc 命令。

2.1.1. 在 RHEL 9 上下载并安装 JMC

您可以使用 Red Hat Subscription Management (RHSM)工具在本地 Red Hat Enterprise Linux (RHEL) 9 操作系统上下载并安装 JDK Mission Control (JMC)。

先决条件

  • 在 RHEL 上下载并安装红帽构建的 OpenJDK 11.0.23。
  • 以 root 用户身份登录您的操作系统。
  • 在红帽客户门户网站中 注册了一个帐户。
  • 注册了一个具有有效订阅的 RHSM 帐户,供您访问红帽构建的 OpenJDK 11 存储库。有关将您的系统注册到 RHSM 帐户的更多信息,请参阅使用红帽订阅管理( {Using Red Hat Subscription Management})注册系统

流程

  1. 在 RHEL 上启用 CodeReady Linux Builder (CRB)存储库,以便在 RHEL 上安装下载的 JMC 软件包。您可以通过完成以下操作来启用 CRB 存储库:

    1. 要在 RHEL 上启用 CRB 存储库,请发出以下 RHSM 命令:

      # subscription-manager repos --enable codeready-builder-for-rhel-9-x86_64-rpms
    2. 要检查 CRB 存储库中的模块列表,请运行以下命令:

      # yum module list --disablerepo=* --enablerepo=codeready-builder-for-rhel-9-x86_64-rpms

      以下示例输出显示了在存储库的 common 配置集中定义的 javapackages-tools 模块:

      # yum module list --disablerepo=* --enablerepo=codeready-builder-for-rhel-9-x86_64-rpms
      
      Updating Subscription Management repositories.
      Last metadata expiration check: 0:40:08 ago on Tue 02 May 2023 08:49:29 AM EDT.
      Red Hat CodeReady Linux Builder for RHEL 9 x86_64 (RPMs)
      Name                      Stream        Profiles        Summary
      javapackages-tools        201801        common          Tools and macros for Java packaging support
      virt-devel                rhel                          Virtualization module
      
      Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

      前面的例子还显示了没有分配给任何配置集的 virt-devel 模块。

    3. 安装目标软件包。例如,要安装名为 xz-java 的软件包,请发出以下命令并确保遵循任何 CLI 命令提示:

      # yum install xz-java
  2. 要在操作系统上启动 JMC 控制台,请选择以下选项之一:

    • 进入包含 JMC 可执行文件的目录,然后运行以下命令:

      $ jmc -vm /usr/lib/jvm/java-11/bin/java
    • 使用您系统的 file explorer 应用程序导航到 JDK Mission Control 目录,如 /usr/bin/jmc,然后双击 JMC 可执行文件。

2.1.2. 在 RHEL 7 或 RHEL 8 上下载并安装 JMC

您可以使用 Red Hat Subscription Manager (RHSM)工具在本地 Red Hat Enterprise Linux (RHEL) 7 或 RHEL 8 操作系统上下载并安装 JDK Mission Control (JMC)。

先决条件

流程

  1. 要在 RHEL 版本中下载 JMC 软件包,请运行以下命令:

    • 对于 RHEL 8:

      # sudo yum module install jmc:rhel8/common
    • 对于 RHEL 7:

      # sudo yum module install jmc:rhel7/common

      上一命令使用红帽订阅管理工具将 JMC 软件包下载到 RHEL 操作系统。JMC 软件包包括在 Red Hat Subscription Management 服务的 jmc 模块流中。

  2. 要在操作系统中启动 JMC 控制台,请完成以下选项之一:

    • 进入包含 JMC 可执行文件的目录,然后运行以下命令:

      $ jmc -vm /usr/lib/jvm/java-11/bin/java
    • 使用您系统的 file explorer 应用程序导航到 JDK Mission Control 目录,如 /usr/bin/jmc,然后双击 JMC 可执行文件。

2.2. JDK Mission Control (JMC)代理

您可以使用 JMC 代理将 JDK Flight Recorder (JFR)功能添加到正在运行的应用程序中。您还可以使用 JMC 代理将自定义 flight 记录器事件添加到正在运行的 Java 虚拟机(JVM)中。

JMC 代理包括以下功能:

  • 在使用 JFR 模板时,更好地控制启用或禁用生成的事件。
  • 使用 Timestamp 类时有效的时间戳捕获。
  • 生成动态记录时的低内存消耗。

Red Hat build of OpenJDK 11.0.23 安装文件用于 Red Hat Enterprise Linux 和 Microsoft Windows 不包括 JMC Agent 和 JMC 软件包。您必须下载并安装 JMC 代理的第三方版本,然后在您选择的平台上检查其与 JMC 软件包的兼容性。

重要

红帽不支持第三方应用程序,如 JMC Agent。在决定将任何第三方应用程序用于红帽产品之前,请确保测试下载软件的安全性和可信性。

注意

JMC Agent 的图形用户界面(GUI)在 Red Hat Enterprise Linux 和 Microsoft Windows 上相似显示,除了 Java 特定于任一平台的 Standard Widget Toolkit (SWT)引入的图形更改。

构建 JMC 代理并且具有 JMC Agent JAR 文件后,您可以在 JMC 控制台的 JVM 浏览器 面板中访问 JMC 代理插件。使用这个插件,您可以在 JMC 控制台中使用 JMC 代理功能,如配置 JMC 代理或管理 JMC 代理如何与 JFR 数据交互。

其他资源

2.3. 启动 JDK Mission Control (JMC)代理

您可以使用 JMC 代理插件启动 JMC 代理。Red Hat Enterprise Linux 和 Microsoft Windows 支持使用此插件。

启动 JMC 代理后,您可以配置代理或管理代理如何与 JFR 数据交互。

先决条件

  • 在 Red Hat Enterprise Linux 或 Microsoft Windows 上下载并安装 jmc 软件包
  • 下载 Adoptium Agent JAR 文件。请参阅 adoptium/jmc-build (GitHub)
  • 使用 --add-opens=java.base/jdk.internal.misc=ALL-UNNAMED 标志启动 Java 应用程序。例如: . /<your_application> --add-opens=java.base/jdk.internal.misc=ALL-UNNAMED
注意

Adoptium 是一个社区支持的项目。红帽生产服务级别协议(SLA)不支持使用 Adoptium 中的 agent.jar 文件。

流程

  1. 根据您的操作系统,选择以下任一方法启动 JMC 控制台:

    1. 在 Red Hat Enterprise Linux 上,进入到包含可执行文件的目录,然后发出 ./jmc 命令。
    2. 在 Microsoft Windows 上,导航到包含 jmc.exe 文件的目录,然后发出 jmc 命令。

      注意

      您还可以使用系统的 file explorer 应用程序导航到 JDK Mission Control 目录,在任一系统上启动 JMC 应用程序,然后双击 JMC 可执行文件。

  2. 导航到 JVM 浏览器 导航面板。在此面板中,您可以查看任何可用的 JVM 连接。
  3. 在 JVM 浏览器面板中,展开您的目标 JVM 实例,如 [11.0.13] JVM Running Mission Control。目标 JVM 实例下显示的项目列表。
  4. 双击导航面板中的 JMC Agent 项。JMC 控制台中打开 Start JMC Agent 窗口:

    图 2.1. 启动 JMC Agent 窗口

    jmc start jmc 浏览器
  5. 使用 Browse 按钮,将 JMC Agent 的 JAR 文件添加到 Agent JAR 字段中。Agent XML 字段是可选的。

    注意

    您不需要在 Target JVM 字段中输入值,因为 JMC 会自动根据所选目标 JVM 实例添加值。

  6. Start 按钮。

    JMC 在 JVM 浏览器导航面板中将 Agent Plugin 项添加到目标 JVM 实例下。JMC 控制台会自动打开 Agent Live Config 窗格。

    图 2.2. 代理实时配置窗格

    jmc 代理实时配置

    现在,您可以配置 JMC 代理或管理 JMC 代理和 JFR 数据之间的交互。生成 XML 配置并将其上传到 JMC 控制台后,Agent Live Config 窗格会显示与该 XML 文件关联的元数据。

    图 2.3. 添加到 JMC 控制台的 XML 配置文件示例

    jmc 代理实时配置完成

2.4. 使用 JMC 代理创建预设置

您可以在 JMC 控制台中配置 JMC Agent 实例。

JMC 控制台提供以下 JMC Agent 配置选项,用于名称,但几个:

  • 使用 Agent Preset Manager 选项创建自定义预设置。
  • 将 XML 配置导入到您的 JMC 代理预设置中。
  • 使用 defineEventProbes 函数添加自定义 JFR 事件的 XML 描述。
  • 将活跃的自定义 JFR 事件存储为预先设置,以便您可以在以后的阶段检索它们。

先决条件

  • 在 JMC 控制台中启动了 JMC 代理实例。

流程

  1. 您可以通过单击菜单栏中的 Window 来创建新的预设置,然后单击 JMC Agent Preset Manager 菜单项。JMC Agent Configuration Preset Manager 向导将在 JMC 控制台中打开。
  2. Add 按钮访问 Edit Preset Global Configuration 窗口。

    图 2.4. 编辑预设置全局配置窗口

    jmc edit preset 全局配置

    在这个窗口中,您可以为预设置输入一个名称。另外,您可以为您要注入目标 JVM 的任何事件输入类前缀。您还可以选中 AllowtoString 复选框和 Allow Converter 复选框。

  3. Next 按钮。此时会打开 Add or Remove Preset Events 窗口。在这个窗口中,您可以为预设置添加新事件、编辑事件或删除事件。

    图 2.5. 添加或删除预设置事件

    jmc add remove preset events
  4. 按照向导的说明,您可以完成以下步骤:

    1. 编辑事件配置
    2. 编辑参数或返回值步骤
    3. 编辑参数或返回值捕获

      提示

      您可以选择每个向导步骤中的任何可用按钮来完成所需的配置,如 AddRemove 等等。您可以点击任何阶段的 Back 按钮编辑之前的向导步骤。

  5. Finish 按钮返回到 AddRemove Preset Events 窗口。
  6. 点击 Next。此时会打开一个 Preview Preset Output 窗口。
  7. 在点 Finish 按钮前查看生成的 XML 数据:

    图 2.6. 预览预设置输出

    jmc preview preset 输出
  8. 点 JMC 控制台窗口右上角的 Load preset 按钮,然后将预设置上传到 JMC 应用程序。
  9. JMC Agent Configuration Preset Manager 窗口中,单击 OK 按钮,将预设置加载到目标 JVM 中。JMC 控制台上的 Agent Live Present 面板显示您的活跃代理配置及其任何注入的事件。例如:

    图 2.7. Agent Live Present 窗格中的输出示例

    jmc 代理实时配置示例

其他资源

2.5. JMC 代理插件属性

JMC 控制台支持以按钮、下拉列表、文本字段等形式的许多属性。您可以使用特定的 JMC Agent 属性来配置代理。

下表概述了可用于配置 JMC 代理的属性类别,以便您可以使用代理监控特定于您需求的 JFR 数据。

表 2.1. 用于 JMC 代理的配置属性列表。
属性描述

<allowconverter>

确定 JMC 代理是否可以使用转换器。启用转换器后,您可以将自定义数据类型或对象转换为 JFR 内容类型。然后,JFR 可以将这些类型与自定义事件一起记录。

<allowtostring>

确定 JMC 代理是否可以将数组和对象参数记录为字符串。

注: 检查 toString 方法是否支持 JMC Agent 数组元素和对象。否则,toString 方法的行为可能会导致 JMC 代理的问题。

<classPrefix>

决定注入的事件的前缀。例如: __JFR_EVENT

<config>

包含 JMC 代理的配置选项。

<jfragent>

开始事件定义。& lt;jfragent > 属性是所有其他配置属性的父属性。

表 2.2. 用于 JMC 代理的事件类型属性列表。
属性描述

<class>

定义从方法接收事件类型的类。

<description>

描述事件类型。

<events>

列出代理注入定义的方法的一组事件。事件标签需要 ID。JFR 将事件标签用于自定义事件。

<label>

定义事件类型的名称。

<location>

决定接收注入事件的方法中的位置。例如: ENTRYEXITWRAP 等等。

<path>

指向存储自定义事件的位置的路径。此路径与 JMC 控制台上 JVM 浏览器 导航面板下列出的任何事件相关。

<method>

定义接收注入的事件的方法。method 属性要求您定义以下两个值:

  • 名称 :方法的名称
  • 描述符 :正式方法描述符。格式为 (ParameterDescriptors) ReturnDescriptor

<stacktrace>

决定事件类型记录堆栈追踪。

表 2.3. 用于 JMC 代理的自定义标题属性列表。
属性描述

<converter>

转换程序类的合格名称,用于将属性转换为 JFR 数据类型。

<contenttype>

定义 converter 属性接收的 JFR 内容类型。

<description>

自定义 caption 属性的描述。

<parameters>

可选属性。根据分配给参数标签的索引值列出方法参数。

<name>

自定义 caption 属性的名称。

表 2.4. 捕获用于 JMC Agent 的属性的字段列表。
属性描述

<description>

要捕获的字段的描述。

<expression>

定义一个表达式,代理分析以查找定义的字段。

<fields>

决定 JMC Agent 捕获并发出任何定义的事件类型的类字段值。

<name>

捕获属性 的 class 字段的名称。

第 3 章 启动 JDK Flight Recorder

3.1. 当 JVM 启动时启动 JDK Flight Recorder

当 Java 进程启动时,您可以启动 JDK Flight Recorder (JFR)。您可以通过添加可选参数来修改 JFR 的行为。

流程

  • 使用 --XX 选项运行 java 命令。

    $ java -XX:StartFlightRecording Demo

    其中 Demo 是 Java 应用的名称。

    JFR 使用 Java 应用程序启动。

示例

以下命令启动一个 Java 进程(Demo),它启动一小时的 flight 记录,该记录保存到名为 demorecording.jfr 的文件:

$ java -XX:StartFlightRecording=duration=1h,filename=demorecording.jfr Demo

其他资源

3.2. 在运行的 JVM 上启动 JDK Flight Recorder

您可以使用 jcmd 工具将诊断命令请求发送到正在运行的 JVM。J cmd 包含了与 JFR 交互的命令,以及启动、dumpstop 的最基本命令。

要与 JVM 交互,jcmd 需要 JVM 的进程 ID (pid)。您可以使用 jcmd -l 命令来检索,该命令显示正在运行的 JVM 进程 ID 的列表,以及用于启动进程的主类和命令行参数等其他信息。

jcmd 工具位于 $JAVA_HOME/bin 下。

流程

  • 使用以下命令启动 flight 记录:

    $ jcmd &lt ;pid> JFR.start &lt ;options>

    例如,以下命令会启动名为 demorecording 的记录,这会保留最后四小时中的数据,其大小限制为 400 MB:

    $ jcmd & lt;pid > JFR.start name=demorecording maxage=4h maxsize=400MB

其他资源

3.3. 使用 JDK Mission Control 应用程序启动 JVM 上的 JDK Flight Recorder

JDK Mission Control (JMC)应用程序有一个 Flight Recording 向导,允许简化启动和配置 flight 记录体验。

流程

  1. 打开 JVM 浏览器。

    $ JAVA_HOME/bin/jmc

  2. 在 JVM 浏览器视图中右键单击 JVM,然后选择 Start Flight Recording

    Flight Recording 向导将打开。

    图 3.1. JMC JFR 向导

    jmc jfrwizard 2

    JDK Flight Recording 向导有三个页面:

    • 向导的第一页包含 flight 记录的常规设置,包括:

      • 记录的名称
      • 保存记录的路径和文件名
      • 无论记录是固定时间还是持续记录,将使用哪些事件模板
      • 记录描述
    • 第二个页面包含 flight 记录的事件选项。您可以配置 Garbage Collections、Memory Profiling 和 Method Sampling 和其他事件记录的详细信息级别。
    • 第三页包含事件详情的设置。您可以打开或关闭事件,启用堆栈追踪记录,并更改记录事件所需的时间阈值。
  3. 编辑记录的设置。
  4. 单击 Finish

    向导会退出,并开始 flight 记录。

3.4. 定义和使用自定义事件 API

JDK Flight Recorder (JFR)是一个包含自定义事件 API 的事件记录器。自定义事件 API 存储在 jdk.jfr 模块中,是一种软件接口,使您的应用程序可以与 JFR 通信。

JFR API 包括可用于管理记录和为您的 Java 应用程序、JVM 或操作系统创建自定义事件的类。

在使用自定义事件 API 监控事件前,您必须为自定义事件类型定义名称和元数据。

您可以通过扩展 Event 类来定义 JFR 基础事件,如 DurationInstantRequestableTime 事件。具体来说,您可以将字段(如持续时间值)添加到与应用程序有效负载属性定义的数据类型匹配的类中。定义 Event 类后,您可以创建事件对象。

此流程演示了如何将自定义事件类型与 JFR 和 JDK Mission Control (JMC)搭配使用,以分析简单示例程序的运行时性能。

流程

  1. 在自定义事件类型中,在 Event 类中,使用 @name 注释来命名自定义事件。此名称显示在 JMC 图形用户界面(GUI)中。

    Event 类中定义自定义事件类型名称的示例

    @Name(“SampleCustomEvent”)
    public class SampleCustomEvent extends Event {...}

  2. 定义 Event 类及其属性的元数据,如 name、category 和 labels。标签显示客户端的事件类型,如 JMC。

    注意

    大型记录文件可能会导致性能问题,这可能会影响您与文件交互的方式。确保正确定义您需要的事件记录注解数量。定义不必要的注解可能会增加您的记录文件的大小。

    为示例 事件类定义注解示例

    @Name(“SampleCustomEvent”)  1
    @Label("Sample Custom Event")
    @Category("Sample events")
    @Description("Custom Event to demonstrate the Custom Events API")
    @StackTrace(false) 2
    public class SampleCustomEvent extends Event {
    
    
        @Label("Method") 3
        public String method;
    
    
        @Label("Generated Number")
        public int number;
    
    
        @Label("Size")
        @DataAmount 4
        public int size;
    }

    1
    详情注解,如 @Name,用于定义 JMC GUI 上如何显示自定义事件的元数据。
    2
    @StackTrace 注释会增加 flight 记录的大小。默认情况下,JFR 不包含为事件创建的位置的 stackTrace
    3
    @Label 注释定义各个方法的参数,如 HTTP 请求的资源方法。
    4
    @DataAmount 注释包含一个属性,它以字节为单位定义数据量。JMC 会自动以其他单位呈现数据量,如 MB (MB)。
  3. 事件 类中定义上下文信息。此信息设置自定义事件类型的请求处理行为,以便您可以配置事件类型以收集特定的 JFR 数据。

    定义简单 类和事件循环的示例

    public class Main {
    
    	private static int requestsSent;
    
    	public static void main(String[] args) {
        	// Register the custom event
        	FlightRecorder.register(SampleCustomEvent.class);
        	// Do some work to generate the events
        	while (requestsSent <= 1000) {
            	try {
                	eventLoopBody();
                	Thread.sleep(100);
            	} catch (Exception e) {
                	e.printStackTrace();
            	}
        	}
        }
    
    	private static void eventLoopBody() {
        	// Create and begin the event
        	SampleCustomEvent event = new SampleCustomEvent();
        	event.begin();
        	// Generate some data for the event
        	Random r = new Random();
        	int someData = r.nextInt(1000000);
        	// Set the event fields
        	event.method = "eventLoopBody";
        	event.number = someData;
        	event.size = 4;
        	// End the event
        	event.end();
        	event.commit();
        	requestsSent++;
        }

    在前面的示例中,简单 类注册事件,事件循环会填充事件字段,然后发出自定义事件。

  4. 在您选择的应用程序中检查事件类型,如 JMC 或 JFR 工具。

    图 3.2. 检查 JMC 中的事件类型示例

    检查事件类型示例应用程序

    JFR 记录可以包括不同的事件类型。您可以检查应用程序中的每个事件类型。

其他资源

第 4 章 JDK Flight Recorder 的配置选项

您可以使用命令行或诊断命令配置 JDK Flight Recorder (JFR)来捕获各种事件集合。

4.1. 使用命令行配置 JDK Flight Recorder

您可以使用以下选项从命令行配置 JDK Flight Recorder (JFR):

4.1.1. 启动 JFR

使用 -XX:StartFlightRecording 选项为 Java 应用启动 JFR 记录。例如:

java -XX:StartFlightRecording=delay=5s,disk=false,dumponexit=true,duration=60s,filename=myrecording.jfr <<YOUR_JAVA_APPLICATION>>

您可以在启动 JFR 记录时 设置以下参数=value 条目:

delay=time
使用此参数指定 Java 应用程序启动时间和记录开始之间的延迟。附加 s 以指定时间(以秒为单位)、m 表示分钟、h 表示小时或 d 表示天。例如,指定 10m 表示 10 分钟。默认情况下,没有延迟,此参数被设为 0。
disk={true|false}
使用此参数指定在记录时是否将数据写入磁盘。默认情况下,此参数为 true
dumponexit={true|false}
使用此参数指定在 JVM 关闭时是否转储正在运行的记录。如果启用了该参数且未设置文件名,则记录将写入到启动记录进度的目录中的文件。文件名是系统生成的名称,其中包含进程 ID、记录 ID 和当前时间戳。例如,hotspot-pid-47496-id-1-2018_01_25_19_10_41.jfr。默认情况下,此参数为 false
duration=time
使用此参数指定记录的持续时间。附加 s 以指定时间(以秒为单位)、m 表示分钟、h 表示小时或 d 表示天。例如,如果您将持续时间指定为 5h,这表示 5 小时。默认情况下,此参数被设置为 0,这意味着记录持续时间中没有设置限制。
filename=path

使用此参数指定记录文件的路径和名称。记录会在停止时写入此文件。例如:

records.jfr

· /home/user/recordings/recording.jfr

name=identifier
使用此参数指定记录的名称和标识符。
maxAge=time
使用此参数指定在磁盘上应提供记录的最大天数。只有 disk 参数设置为 true 时,此参数才有效。附加 s 以指定时间(以秒为单位)、m 表示分钟、h 表示小时或 d 表示天。例如,当您指定 30s 时,它表示 30 秒。默认情况下,此参数被设置为 0,这意味着没有设置限制。
maxsize=size
使用此参数指定要为记录保留的最大磁盘数据大小。只有 disk 参数设置为 true 时,此参数才有效。该值不能小于使用 -XX:FlightRecorderOptions 设置的 maxchunksize 参数的值。附加 m 或 M 以指定大小(以 MB 为单位),或者 g 或 G 以指定大小(以 GB 为单位)。默认情况下,磁盘数据的最大大小没有限制,此参数被设置为 0。
path-to-gc-roots={true|false}

使用此参数指定在记录末尾是否收集垃圾回收(GC) root 的路径。默认情况下,此参数被设置为 false。

GC root 的路径对于查找内存泄漏非常有用。对于红帽构建的 OpenJDK 11,您可以启用 OldObjectSample 事件,该事件比使用堆转储更高效。您还可以在生产环境中使用 OldObjectSample 事件。收集内存泄漏信息会非常耗时,并会产生额外的开销。只有在您开始记录您怀疑有内存泄漏的应用程序时,才应启用此参数。如果 JFR 配置集参数设置为 profile,您可以跟踪对象泄漏的堆栈。它包含在收集的信息中。

settings=path
使用此参数指定事件设置文件的路径和名称(类型为 JFC)。默认情况下,使用 default.jfc 文件,该文件位于 JAVA_HOME/lib/jfr 中。此默认设置文件收集一组预定义的开销信息,因此对性能的影响最少,并可与持续运行的记录一起使用。第二个设置文件也会提供 profile.jfc,它提供比默认配置更多的数据,但可能会有更多的开销和影响性能。当需要更多信息时,请使用此配置短时间。
注意

您可以通过逗号分隔多个参数的值来为多个参数指定值。例如,-XX:StartFlightRecording=disk=false,name=example-recording

4.1.2. JFR 的控制行为

使用 -XX:FlightRecorderOptions 选项设置控制 JFR 行为的参数。例如:

java -XX:FlightRecorderOptions=duration=60s,filename=myrecording.jfr -XX:FlightRecorderOptions=stackdepth=128,maxchunksize=2M <<YOUR_JAVA_APPLICATION>>

您可以 设置以下参数=value 条目来控制 JFR 的行为:

globalbuffersize=size
使用此参数指定用于数据保留的主要内存量。默认值基于为 memorysize 指定的值。您可以更改 memorysize 参数,以更改全局缓冲区的大小。
maxchunksize=size
使用此参数指定记录中数据块的最大大小。附加 m 或 M 以指定以 MB (MB)或 g 或 G 为单位的大小,以指定以 GB 为单位的大小。默认情况下,数据块的最大大小设置为 12 MB。允许的最小大小为 1 MB。
memorysize=size
使用此参数来确定应使用多少缓冲区内存。参数根据指定的大小设置 globalbuffersizenumglobalbuffers 参数。附加 m 或 M 以指定以 MB (MB)或 g 或 G 为单位的大小,以指定以 GB 为单位的大小。默认情况下,内存大小设置为 10 MB。
numglobalbuffers=number
使用此参数指定使用的全局缓冲区数量。默认值基于 memorysize 参数中指定的大小。您可以更改 memorysize 参数,以更改全局缓冲区的数量。
old-object-queue-size=number-of-objects
使用此参数跟踪旧对象的最大数量。默认情况下,对象数量设置为 256。
repository=path
使用此参数指定临时磁盘存储的存储库。默认情况下,它使用系统临时目录。
retransform={true|false}
使用此参数指定是否应使用 JVMTI 重新传输事件类。如果设置为 false,则会将检测添加到加载的事件类中。默认情况下,此参数被设置为 true,以启用类重新传输。
samplethreads={true|false}
使用此参数指定是否启用了线程抽样。只有在启用抽样事件且此参数设为 true 时,线程抽样才会发生。默认情况下,此参数设为 true
stackdepth=depth
使用此参数为堆栈跟踪设置堆栈深度。默认情况下,堆栈深度设置为 64 方法调用。您可以将最大堆栈深度设置为 2048。大于 64 的值可以创建大量开销并降低性能。
threadbuffersize=size
使用此参数指定线程的本地缓冲区大小。默认情况下,本地缓冲区大小设置为 8 KB,最小值为 4 KB。覆盖此参数可能会降低性能,我们不推荐这样做。
注意

您可以通过逗号分隔多个参数的值来为多个参数指定值。

4.2. 使用诊断命令(JCMD)配置 JDK Flight Recorder

您可以使用 Java 诊断命令配置 JDK Flight Recorder (JFR)。执行诊断命令的最简单方法是使用位于 Java 安装目录中的 jcmd 工具。若要使用命令,您必须传递 JVM 的进程标识符或主类的名称,并将实际命令作为参数传递给 jcmd。您可以通过运行不带参数的 jcmd 或主类名称来检索 JVM 或主类的名称。jps(Java Process Status)工具列出了目标系统上其具有访问权限的 JVM。

要查看所有正在运行的 Java 进程的列表,请使用不带任何参数的 jcmd 命令。要查看正在运行的 Java 应用程序可用的命令的完整列表,请在进程标识符或主类的名称后将 help 指定为诊断命令。

对 JFR 使用以下诊断命令:

4.2.1. 启动 JFR

使用 JFR.start 诊断命令启动 flight 记录。例如:

jcmd <PID> JFR.start delay=10s duration=10m filename=recording.jfr
表 4.1. 下表列出了您可以使用的参数:
参数描述数据类型默认值

name

记录的名称

字符串

-

设置

服务器端模板

字符串

-

duration

记录持续时间

Time

0s

filename

生成记录文件名

字符串

-

maxAge

缓冲数据的最长期限

Time

0s

maxsize

缓冲区的最大大小(以字节为单位)

Long

0

dumponexit

JVM 关闭时运行的转储记录

布尔值

-

path-to-gc-roots

收集垃圾收集器 root 的路径

布尔值

False

4.2.2. 停止 JFR

使用 JFR.stop 诊断命令停止运行 flight 记录。例如:

jcmd <PID> JFR.stop name=output_file
表 4.2. 下表列出了您可以使用的参数。
参数描述数据类型默认值

name

记录的名称

字符串

-

filename

将记录数据复制到文件中

字符串

-

4.2.3. 检查 JFR

使用 JFR.check 命令显示正在进行中的记录的信息。例如:

jcmd <PID> JFR.check
表 4.3. 下表列出了您可以使用的参数。
参数描述数据类型默认值

name

记录的名称

字符串

-

filename

将记录数据复制到文件中

字符串

-

maxAge

转储文件的最大持续时间

Time

0s

maxsize

转储的最大字节数

Long

0

begin

开始转储数据的时间

字符串

-

end

转储数据的结束时间

字符串

-

path-to-gc-roots

收集垃圾收集器 root 的路径

布尔值

false

4.2.4. dump JFR

使用 JFR.dump 诊断命令将 flight 记录的内容复制到文件中。例如:

jcmd <PID> JFR.dump name=output_file filename=output.jfr
表 4.4. 下表列出了您可以使用的参数。
参数描述数据类型默认值

name

记录的名称

字符串

-

filename

将记录数据复制到文件中

字符串

-

maxAge

转储文件的最大持续时间

Time

0s

maxsize

转储的最大字节数

Long

0

begin

开始转储数据的时间

字符串

-

end

转储数据的结束时间

字符串

-

path-to-gc-roots

收集垃圾收集器 root 的路径

布尔值

false

4.2.5. 配置 JFR

使用 JFR.configure 诊断命令配置 flight 记录。例如:

jcmd <PID> JFR.configure repositorypath=/home/jfr/recordings
表 4.5. 下表列出了您可以使用的参数。
参数描述数据类型默认值

repositorypath

到仓库的路径

字符串

-

dumppath

转储的路径

字符串

-

stackdepth

堆栈深度

Jlong

64

globalbuffercount

全局缓冲区数

Jlong

32

globalbuffersize

全局缓冲区的大小

Jlong

524288

thread_buffer_size

线程缓冲的大小

Jlong

8192

memorysize

总内存大小

Jlong

16777216

maxchunksize

单个磁盘块的大小

Jlong

12582912

Samplethreads

激活线程抽样

布尔值

true

更新于 2024-05-10

法律通告

Copyright © 2024 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.