系列中的上一篇
当前教程
配置 JDK Flight Recorder
系列中的下一篇

系列中的上一篇: JDK Flight Recorder 入门

系列中的下一篇: JFR 命令行工具

配置 JDK Flight Recorder

JDK Flight Recorder 带有一组默认的启发式算法和设置。这些默认设置可能适用于简单的情况,但在大多数生产环境中,用户需要配置 JFR 以更好地满足其特定需求。配置 JFR 有四个不同的级别:录制选项、配置设置、事件设置和 Flight Recorder 选项。本节将介绍每个级别。

录制选项

录制选项控制 JFR 的整体行为,涵盖数据保留时间、使用哪些配置等设置。录制选项在 JFR 初始化时提供;-XX:StartFlightRecordingJFR.start,或使用 JFR.config

注意: -XX:StartFlightRecordingJFR.startJFR.config 都接受相同的选项,但是使用 -XX:StartFlightRecording 时,每个选项用逗号 (,) 分隔,而使用 JFR.startJFR.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 参数的值。附加 mM 以指定以兆字节为单位的大小,或 gG 以指定以千兆字节为单位的大小。默认情况下,磁盘数据的最大大小限制为 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.jfcprofile.jfc,它们位于 JAVA_HOME/lib/jfr 中。

注意: 从 JDK 19 开始,强烈建议使用 jfr configure 实用程序来创建设置文件。

事件选项

事件选项主要在配置文件中定义,控制 JFR 如何收集事件。从 JDK 17 开始,这些值也可以通过 -XX:StartFlightRecordingJFR.startJFR.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: 确定应使用多少缓冲区内存,并根据指定的大小设置 globalbuffersizenumglobalbuffers 参数。附加 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 日


系列中的上一篇
当前教程
配置 JDK Flight Recorder
系列中的下一篇

系列中的上一篇: JDK Flight Recorder 入门

系列中的下一篇: JFR 命令行工具