配置 JDK Flight Recorder
JDK Flight Recorder 带有一组默认的启发式算法和设置。这些默认设置可能适用于简单的情况,但在大多数生产环境中,用户需要配置 JFR 以更好地满足其特定需求。配置 JFR 有四个不同的级别:录制选项、配置设置、事件设置和 Flight Recorder 选项。本节将介绍每个级别。
录制选项
录制选项控制 JFR 的整体行为,涵盖数据保留时间、使用哪些配置等设置。录制选项在 JFR 初始化时提供;-XX:StartFlightRecording
或 JFR.start
,或使用 JFR.config
。
注意: -XX:StartFlightRecording
、JFR.start
和 JFR.config
都接受相同的选项,但是使用 -XX:StartFlightRecording
时,每个选项用逗号 (,
) 分隔,而使用 JFR.start
和 JFR.config
时,使用空格 (
) 分隔。以下示例会导致相同的配置
java -XX:StartFlightRecording:filename=recording.jfr,settings=profile.jfc
JFR.start filename=recording.jfr settings=profile.jfc
delay=time
: 指定 Java 应用程序启动时间和录制开始之间的延迟。附加 s 以指定以秒为单位的时间,m 以指定以分钟为单位的时间,h 以指定以小时为单位的时间,或 d 以指定以天为单位的时间(例如,指定 10m 表示 10 分钟)。默认情况下,没有延迟,此参数设置为 0。disk={[true]|false}
: 指定是否在录制时将数据写入磁盘。默认情况下,此参数已启用。dumponexit={true|[false]}
: 指定 JVM 关闭时是否转储正在运行的录制。如果启用并且未输入文件名,则录制将写入进程启动的目录中的文件。文件名是系统生成的名称,包含进程 ID、录制 ID 和当前时间戳,类似于hotspot-pid-47496-id-1-2018_01_25_19_10_41.jfr
。默认情况下,此参数已禁用。duration=time
: 指定录制的持续时间。附加 s 以指定以秒为单位的时间,m 以指定以分钟为单位的时间,h 以指定以小时为单位的时间,或 d 以指定以天为单位的时间(例如,指定 5h 表示 5 小时)。默认情况下,持续时间没有限制,此参数设置为 0。filename=path
: 指定停止录制时写入录制的路径和文件名,例如
recording.jfr
/home/user/recordings/recording.jfr
c:\recordings\recording.jfr
name=identifier
: 接受录制的名称和标识符。maxage=time
: 指定要为录制保留的磁盘数据的最大年龄。此参数仅在磁盘参数设置为 true 时有效。附加 s 以指定以秒为单位的时间,m 以指定以分钟为单位的时间,h 以指定以小时为单位的时间,或 d 以指定以天为单位的时间(例如,指定 30s 表示 30 秒)。默认情况下,最大年龄没有限制,此参数设置为 0s。maxsize=size
: 指定要为录制保留的磁盘数据的最大大小(以字节为单位)。此参数仅在磁盘参数设置为 true 时有效。该值必须不小于使用-XX:FlightRecorderOptions
设置的maxchunksize
参数的值。附加m
或M
以指定以兆字节为单位的大小,或g
或G
以指定以千兆字节为单位的大小。默认情况下,磁盘数据的最大大小限制为 250 MB。path-to-gc-roots={true|false}
: 指定是否在录制结束时收集到垃圾回收 (GC) 根的路径。默认情况下,此参数已禁用。- 到 GC 根的路径有助于查找内存泄漏,但收集它很耗时。仅当您为怀疑存在内存泄漏的应用程序启动录制时,才启用此选项。如果设置参数设置为 profile,则包含在收集的信息中的是分配潜在泄漏对象的堆栈跟踪。
settings=path
: 指定事件设置文件(类型为 JFC)的路径和名称。您可以通过逗号分隔多个参数的值。可以使用以下语法指定事件设置和 .jfc 选项
option=value
: 指定要修改的选项值。要列出可用选项,请使用JAVA_HOME/bin/jfr
工具。event-setting=value<event-name>#<setting-name>=<value>
: 指定要修改的事件设置值。要添加新的事件设置,请在事件名称前加上+
。
配置设置
配置设置在 JFR 配置文件 (.jfc
) 中定义,并通过 settings
选项提供给 JFR。它们包含事件设置以及 JDK Mission Control 将使用的控件。JFR 带有两个预定义的设置文件;default.jfc
和 profile.jfc
,它们位于 JAVA_HOME/lib/jfr
中。
注意: 从 JDK 19 开始,强烈建议使用 jfr configure
实用程序来创建设置文件。
事件选项
事件选项主要在配置文件中定义,控制 JFR 如何收集事件。从 JDK 17 开始,这些值也可以通过 -XX:StartFlightRecording
、JFR.start
和 JFR.config
提供。通过命令行提供的事件选项设置会覆盖 .jfc
文件中提供的设置,并且两者都会覆盖事件类中注释提供的设置。
enabled
:Boolean
,控制 JFR 是否会收集事件。默认值为true
。period
:Duration
,控制 JFR 在记录此事件的另一个实例之前等待的最小时间长度。默认值为0
。提供ns
表示纳秒,ms
表示毫秒,s
表示秒,m
表示分钟,h
表示小时。threshold
:Duration
,控制此事件执行的最小时间长度,在此之后 JFR 将记录该事件。默认值为0
。提供ns
表示纳秒,ms
表示毫秒,s
表示秒,m
表示分钟,h
表示小时。stackTrace
:Boolean
,控制 JFR 是否会记录与事件关联的堆栈跟踪。默认值为true
。
Flight Recorder 选项
这些配置集通过 -XX:FlightRecorderOptions
JVM 参数提供,通常控制 JFR 如何处理从事件记录到将它们存储在内存或磁盘中的数据流。通常,默认值对于大多数用户来说已经足够了,但用户可能需要更改默认值以更好地满足其性能目标。
每个选项都用逗号 (,
) 分隔,例如
java -XX:FlightRecorderOptions:maxchunksize=1M,numglobalbuffers=5
globalbuffersize=size
: 指定用于数据保留的主内存的总量。默认值基于为memorysize
指定的值。更改memorysize
参数以更改全局缓冲区的大小。maxchunksize=size
: 指定录制中数据块的最大大小(以字节为单位)。附加 m 或 M 以指定以兆字节 (MB) 为单位的大小,或 g 或 G 以指定以千兆字节 (GB) 为单位的大小。默认情况下,数据块的最大大小设置为 12 MB。允许的最小值为 1 MB。memorysize=size
: 确定应使用多少缓冲区内存,并根据指定的大小设置globalbuffersize
和numglobalbuffers
参数。附加 m 或 M 以指定以兆字节 (MB) 为单位的大小,或 g 或 G 以指定以千兆字节 (GB) 为单位的大小。默认情况下,内存大小设置为 10 MB。numglobalbuffers
: 指定使用的全局缓冲区的数量。默认值基于指定的内存大小。更改memorysize
参数以更改全局缓冲区的数量。old-object-queue-size=number-of-objects
: 要跟踪的旧对象的最大数量。默认情况下,对象的數量设置为 256。repository=path
: 指定用于临时磁盘存储的存储库(目录)。默认情况下,使用系统的临时目录。retransform={[true]|false}
: 指定是否应使用 JVMTI(Java 虚拟机工具接口)重新转换事件类。如果为 false,则在加载事件类时添加检测。默认情况下,此参数已启用。stackdepth=depth
: 堆栈跟踪的堆栈深度。默认情况下,深度设置为 64 个方法调用。最大值为 2048。大于 64 的值可能会产生重大开销并降低性能。threadbuffersize=size
: 指定每个线程本地缓冲区的大小(以字节为单位)。默认情况下,本地缓冲区大小设置为 8 千字节,最小值为 4 千字节。覆盖此参数可能会降低性能,不建议这样做。
上次更新: 2021 年 9 月 14 日