第 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 17,您可以启用
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
-
使用此参数来确定应使用多少缓冲区内存。参数根据指定的大小设置
globalbuffersize
和numglobalbuffers
参数。附加 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。覆盖此参数可能会降低性能,我们不推荐这样做。
您可以通过逗号分隔多个参数的值来为多个参数指定值。