系列中的上一篇
当前教程
JDK Flight Recorder 入门
系列中的下一篇

系列中的上一篇: JDK Flight Recorder 简介

系列中的下一篇: 配置 JDK Flight Recorder

JDK Flight Recorder 入门

本节将介绍启动 JFR 记录和从记录中提取数据的基本知识。在大多数情况下,用户希望在启动 JFR 时提供配置,但我们将在下一节中介绍配置 JFR。

启动 JFR 记录

JFR 可以在 JVM 启动时启动,也可以在已经运行的 JVM 上启用。在大多数情况下,在启动时初始化 JFR 是提供 JVM 最完整视图的最佳选择;但是,如果 JVM 开始遇到问题,并且您希望在关闭它之前收集有关它的数据,则在运行的 JVM 上启用 JFR 会很有帮助。

在启动时启用 JFR

要在启动时启用 JFR,请将 VM 参数 -XX:StartFlightRecording 包含到您的 java 命令中,如以下示例所示

java -XX:StartFlightRecording MyMainClass

这仅仅是运行 JFR 的一种非常基本的方式,不太可能满足大多数 JFR 用户的需求。-XX:StartFlightRecording 可以接受多个配置参数。正如前面提到的,这些参数将在下一节中介绍。

使用 JCMD 在运行的 JVM 上启用 JFR

JFR 也可以使用 jcmd 在运行的 JVM 上启用。第一步是获取要启用 JFR 的 Java 进程的进程 ID (pid)。Java 命令行实用程序 jps 可用于此目的,如以下示例所示

$ jps
75681 Jps
27017 ApplicationMain

如果您想在 ApplicationMain Java 进程上启用 JFR,则需要运行以下命令

$ jcmd 27017 JFR.start

-XX:StartFlightRecording 一样,JFR.start 也可以接受配置参数。

从 JFR 中检索数据

当 JFR 在 Java 进程上运行时,自然会对检查正在收集的数据感兴趣。有几种方法可以做到这一点,在本节中,我们将探讨使用 jcmd 从 JFR 中提取数据。

使用 JCMD 提取 JFR 数据

jcmd 可用于手动从 JFR 中提取数据,称为数据转储。您可以使用以下命令执行转储

jcmd <pid> JFR.dump

此外,JFR.dump 可以接受以下参数,所有参数都是可选的

  • begin: 指定将从哪个时间开始将记录数据包含在转储文件中。格式指定为本地时间。(字符串,无默认值)

  • end: 指定将到哪个时间为止将记录数据包含在转储文件中。格式指定为本地时间。(字符串,无默认值)

    • 注意:对于 begin 和 end,时间必须采用 java.time.LocalTime::parse(STRING)java.time.LocalDateTime::parse(STRING)java.time.Instant::parse(STRING) 可读取的格式。例如,“13:20:15”、“2020-03-17T09:00:00” 或 “2020-03-17T09:00:00Z”。

    • 注意:begin 和 end 时间对应于飞行记录数据中记录信息内的 timestamps。

    • 另一种选择是使用相对于当前时间的相对时间,该时间由负整数后跟“s”、“m”或“h”指定。例如,“-12h”、“-15m”或“-30s”。

  • filename: 将飞行记录数据转储到的文件的名称。如果未提供文件名,则会根据 PID 和当前日期生成文件名。文件名也可以是目录,在这种情况下,文件名将根据 PID 和指定目录中的当前日期生成。(字符串,无默认值)

  • maxage: 将飞行记录数据转储到文件的时间长度。(整数后跟“s”表示秒,“m”表示分钟或“h”表示小时,无默认值)

  • maxsize: 从飞行记录中转储的数据量的最大大小(以字节为单位),如果未使用以下后缀之一,则为“m”或“M”表示兆字节,或“g”或“G”表示千兆字节。(字符串,无默认值)

  • name: (可选)记录的名称。如果未提供名称,则会转储来自所有记录的数据。(字符串,无默认值)

  • path-to-gc-root: 用于在转储记录数据时保存到垃圾回收 (GC) 根的路径的标志。路径信息对于查找内存泄漏很有用,但收集它会导致应用程序暂停一小段时间。仅当您怀疑应用程序存在内存泄漏时才启用此标志。(布尔值,false)

运行 JFR 时的管理操作

除了 jcmd 操作之外;JFR.startJFR.dump 已经介绍过,jcmd 还提供了三个其他管理员操作。

  • JFR.configure : 用于更新 JFR 的配置。
  • JFR.check : 提供有关运行 JFR 的 JVM 的基本诊断信息
  • JFR.stop name=[recording name] : 用于停止 JFR 记录。name 是必需参数。

上次更新: 2021 年 9 月 14 日


系列中的上一篇
当前教程
JDK Flight Recorder 入门
系列中的下一篇

系列中的上一篇: JDK Flight Recorder 简介

系列中的下一篇: 配置 JDK Flight Recorder