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.start
和 JFR.dump
已经介绍过,jcmd
还提供了三个其他管理员操作。
JFR.configure
: 用于更新 JFR 的配置。JFR.check
: 提供有关运行 JFR 的 JVM 的基本诊断信息JFR.stop name=[recording name]
: 用于停止 JFR 记录。name
是必需参数。
上次更新: 2021 年 9 月 14 日