第 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 记录时 设置以下参数=值 条目:
- 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
使用此参数指定记录文件的路径和名称。在停止后,记录会写入该文件。例如:
· recording.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)根的路径。默认情况下,此参数设为 false。
到 GC roots 的路径有助于查找内存泄漏。对于 OpenJDK 8,您可以启用
OldObjectSample事件,该事件比使用堆转储更为高效。您还可以在生产环境中使用OldObjectSample事件。收集内存泄漏信息非常耗时,并产生额外的开销。只有在开始记录出您怀疑存在内存泄漏的应用程序时,您应该启用此参数。如果 JFR profile 参数设置为 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>>
您可以 设置以下参数=值 条目来控制 JFR 的行为:
- globalbuffersize=size
-
使用这个参数指定用于数据保留的主要内存量。默认值基于为
memorysize指定的值。您可以更改memorysize参数,以更改全局缓冲区的大小。 - maxchunksize=size
- 使用这个参数指定记录中数据块的最大大小。附加 m 或 M 以 MB(MB)或 g or G 为单位来指定以 GB(GB)为单位的大小。默认情况下,数据块的最大大小设置为 12MB。允许的最小大小是 1 MB。
- memorysize=size
-
使用这个参数来确定应使用多少缓冲区内存。参数根据指定的大小设置
globalbuffersize和numglobalbuffers参数。附加 m 或 M 以 MB(MB)或 g or G 为单位来指定以 GB(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
- 使用此参数为堆栈 trace 设置堆栈深度。默认情况下,堆栈深度设置为 64 方法调用。您可以将最大堆栈深度设置为 2048。大于 64 的值可能会产生大量开销并降低性能。
- threadbuffersize=size
- 使用此参数指定线程的本地缓冲区大小。默认情况下,本地缓冲区大小设置为 8 KB,最小值为 4 KB。覆盖这个参数可能会降低性能且不推荐。
您可以通过使用逗号分隔多个参数来指定值。