可以同时运行多个JFR记录,并且每个JFR记录都可以使用不同的配置,你可以使用不同的JFR记录去捕获不同的事件集。但是,为了使JFR内部逻辑更加精简,生成的记录始终包含当时活动的所有记录的所有事件的并集。这意味着,运行多个JFR记录,得到的记录信息会多余实际所需的信息。
通过集成到JMC里的Flight Recorder插件来使用JFR是最简单直观的。该插件允许通过直观的GUI使用JFR的功能。有关通过JMC来使用JFR的一些详细说明,请查看JMC官方文档的Flight Recorder插件部分
本文介绍允许和管理JFR记录更高级的用法:
- 使用命令行
- 使用诊断命令
- 配置JFR记录
- 自动创建JFR记录
- 安全
- 故障排除
使用命令行 Command Line
在程序启动时,你可以在命令行通过java的-XX:StartFlightRecording
选项,来开始并配置一个JFR记录,然后声明-XX:+FlightRecorder
选项来启用JFR,因为JFR是一个商业特性,因此还需要声明-XX:+UnlockCommercialFeatures
选项
下面这个例子就说明了如何运行MyApp并且同时开启一个60秒的JFR记录,该记录将保存到一个名为myrecording.jfr
的文件
java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=duration=60s,filename=myrecording.jfr MyApp
使用诊断命令Diagnostic Command
执行诊断命令最简单的方法是使用jcmd工具(位于java安装目录中)。要发出命令,必须将JVM进程号(或主类的名称)和实际的命令作为参数传递给jcmd。
例如在pid为5368的正在运行的java进程上开启一个60秒的JFR记录,并将其保存到当前目录下命名为myrecording.jfr
的文件中
jcmd 5368 JFR.start duration=60s filename=myrecording.jfr
查看所有正在运行的Java进程列表,使用jcmd命令并且不加任何参数。查看对于一个正在运行的Java程序可以使用的所有命令,将help
作为pid(或者主类名称)之后的诊断命令。
与JFR相关的命令包括:
- JFR.start 开始记录
- JFR.check 检查指定进程的所有运行中的JFR记录的运行情况,包括JFR记录id,文件名,持续时间等
- JFR.stop 停止指定id的JFR记录(默认情况下停止id为1的记录)
- JFR.dump 转存指定id的JFR记录,时间为到目前为止收集的数据(默认情况下转储id为1的记录的数据)
配置JFR记录
您可以通过许多其他方式配置JFR记录。无论您如何启动JFR记录(使用命令行或者诊断命令),他们的工作方式都是相同的。
设置大小和寿命
maxsize=size
附加单位为k或K,m或M,g或G,或者不指定单位,默认为1byte字节
maxage=age
附加单位为s秒,或m分,或h小时,或d天数
如果同时设定了大小和寿命限制,则在先达到其中一个限制时将删除数据
设置延迟
在安排JFR记录时,你可能想要在实际开始前添加一个延迟。例如,当从命令行运行时,您可能希望应用程序在开始录制之前启动或达到稳定状态。要实现这一点,请使用delay
参数:
delay=delay
附加单位为s秒,或m分,或h小时,或d天数
设置压缩
尽管录制文件格式非常紧凑,但您仍然可以通过将其添加到ZIP存档中进一步压缩。要启用压缩,请使用以下参数:
compress=true
请注意,压缩需要CPU资源,这会对性能产生负面影响。
自动创建JFR记录
当使用默认记录运行时,您可以配置JFR,以便在出现某些指定情况时自动将当前内存中的记录数据保存到文件中。如果还使用了磁盘存储库,则还将包括磁盘存储库中的当前信息。
退出时创建录音
要在每次JVM退出时将记录数据保存到指定路径,请使用以下选项启动应用程序:
-XX:FlightRecorderOptions=defaultrecording=true,dumponexit=true,dumponexitpath=path
设置应该保存记录的路径。如果指定目录,则在该目录中创建一个以日期和时间作为名称的文件。如果指定文件名,则使用该名称。如果不指定路径,JFR记录文件将保存在当前目录中。
使用触发器创建录音
您可以使用JMC的控制台来设置触发器。触发器是一种规则,只要规则指定的条件为真,它就会执行操作。
例如,您可以创建一个规则,在堆大小超过100 MB时触发JFR记录。JMC中的触发器可以使用通过JMX MBean公开的任何属性作为规则的输入。
在JMX控制台的触发器选项卡定义触发器,有关如何创建触发器的详细信息,请参阅JMC官方文档。
安全
JFR仅用于诊断的目的,JFR记录文件可能包含机密信息,如Java命令行选项和环境变量。在存储或传输JFR记录文件时要像诊断核心文件或堆数据转存一样小心。
使用JFR的各种方法的安全权限
Method方法 | Security安全 |
---|---|
Command line命令行 | 每一个可以访问Java程序命令行的人都必须是可信任的 |
Diagnostic commands诊断命令 | 只有Java进程的所有者可以使用jcmd 来控制该进程。 |
JMC客户端 | JMC客户端使用JMX访问JVM。 |
故障排除
通过使用以下选项之一启动JVM,可以从Java Flight Recorder收集大量诊断信息:
-XX:FlightRecorderOptions=loglevel=debug
-XX:FlightRecorderOptions=loglevel=trace
附:JFR命令参考
Command-Line Options 命令行选项
当您使用java命令行启动你的Java应用程序,您可以指定选项以启用JFR、配置其设置以及开始JFR记录。以下命令行选项特定于Java Flight Recorder:
-XX:+|-FlightRecorder
-XX:FlightRecorderOptions
-XX:StartFlightRecording
这些命令行选项仅在JDK的商业许可证中可用。要使用它们,还必须指定-XX:+UnlockCommercialFeatures
选项。
注:使用 -XX
选项的前提是您对系统有透彻的了解,如果这些命令使用不当,可能会影响系统的稳定性或性能。
-XX
选项是试验性的,随时可能更改。
Diagnostic Command Reference 诊断命令参考
这是对可用于控制JFR的诊断命令和每个命令可用参数的描述。也可通过运行 jcmd
命令和指定的进程标识符,后跟 help
参数和命令名获取帮助信息。例如,若要获取 JFR.start
命令的帮助信息,请运行以下命令:
jcmd 5361 help JFR.start
要获取JVM可用的诊断命令的完整列表,不指定命令名即可,即jcmd 5461 help
与JFR相关的诊断命令包括:
- JFR.start
- JFR.check
- JFR.stop
- JFR.dump
JFR.start 开启
参数 | 说明 | 类型 | 默认 |
---|---|---|---|
name | JFR记录名称 | String | |
settings | 服务器端模板 | String | |
defaultrecording | 开始默认录制 | Boolean | False |
delay | 延迟开始记录 | Time | 0s |
duration | 记录持续时间 | Time | 0s(表示“永远”) |
filename | 生成的记录文件名 | String | |
compress | GZip压缩生成的记录文件 | Boolean | False |
maxage | 缓冲区数据的最长期限 | Time时间 | 0s(表示“无年龄限制”) |
maxsize | 缓冲区的最大大小(字节) | Long长 | 0(表示“无最大大小”) |
JFR.check 检查
参数 | 说明 | 类型 | 默认 |
---|---|---|---|
name | 记录名称 | String | |
recording | 记录ID | Long | 1 |
verbose | 打印详细数据 | Boolean | False |
JFR.stop 停止
参数 | 说明 | 类型 | 默认 |
---|---|---|---|
name | 记录名称 | String | |
recording | 记录ID | Long | 1 |
discard | 丢弃记录数据 | Boolean | |
copy_to_file | 将记录数据复制到文件 | String | |
compress_copy | GZip压缩“复制到文件”的目标 | Boolean | False |
JFR.dump 转存
参数 | 说明 | 类型 | 默认 |
---|---|---|---|
name | 记录名称 | String | |
recording | 记录ID | Long | 1 |
copy_to_file | 将记录数据复制到文件 | String | |
compress_copy | GZip压缩“复制到文件”目标 | Boolean | False |