模块 jdk.jfr

包 jdk.jfr


jdk.jfr
这个包提供类来创建事件和控制飞行记录器。

定义事件

Flight Recorder 将数据收集为事件。事件具有时间戳、持续时间和通常特定于应用程序的有效负载,可用于诊断正在运行的应用程序直至故障或崩溃。

要定义飞行记录器事件,请扩展 Event 并添加与有效载荷的数据类型相匹配的字段。可以使用 jdk.jfr 包中提供的注释或使用具有 MetadataDefinition 注释的用户定义注释来添加有关字段的元数据,例如标签、描述和单位。

定义事件类后,可以创建实例(事件对象)。通过将数据分配给字段来将数据存储在事件中。可以使用 Event 类中可用的 beginend 方法显式控制事件计时。

收集数据以存储在事件中可能很昂贵。 Event.shouldCommit() 方法可用于验证在调用 Event.commit() 方法时是否实际将事件实例写入系统。如果 Event.shouldCommit() 返回 false ,则可以避免这些操作。

有时事件的字段布局在编译时是未知的。在这种情况下,可以动态定义事件。但是,动态事件的性能水平可能与静态定义的事件不同,并且工具可能无法在不知道布局的情况下识别和可视化数据。

要动态定义事件,请使用 EventFactory 类并使用 ValueDescriptor 类定义字段,并使用 AnnotationElement 类定义注释。使用工厂分配事件并使用 Event.set(int, Object) 方法填充它。

控制飞行记录仪

Flight Recorder 可以通过使用 jcmd 命令行工具在本地控制,也可以通过使用在平台 MBeanServer 中注册的 FlightRecorderMXBean 接口远程控制。当需要直接编程访问时,可以通过调用 FlightRecorder.getFlightRecorder() 和使用 Recording 类创建的记录来获取飞行记录器实例,从中配置要记录的数据量。

设置和配置

设置由名称/值对组成,其中 name 指定要配置的事件和设置,value 指定将其设置为什么。

名称可以通过以下方式形成:

<event-name> + "#" + <setting-name>

或者

<event-id> + "#" + <setting-name>

例如,要将 CPU Load 事件的采样间隔设置为每秒一次,请使用名称 "jdk.CPULoad#period" 和值 "1 s" 。如果多个事件使用相同的名称,例如如果一个事件类在多个类加载器中加载,并且需要区分它们,则名称为 "56#period" 。事件的 ID 是通过调用 EventType.getId() 方法获得的,并且对注册该事件的 Java 虚拟机实例有效。

通过调用 FlightRecorder.getEventTypes() EventType.getName() 检索可用事件名称列表。通过调用 EventType.getSettingDescriptors() ValueDescriptor.getName() 获取事件类型的可用设置列表。

预定义设置

事件设置名称及其用途。
Name Description 默认值 Format 示例值
enabled 指定是否记录事件 "true" Boolean"true""false")的字符串表示 "true"
"false"
threshold 指定不记录事件的持续时间 "0"(无限制) "0" 如果未使用阈值,则为正 Long 后跟空格和以下单位之一的字符串表示形式:
  • "ns"(纳秒)
  • "us"(微秒)
  • "ms"(毫秒)
  • "s"(秒)
  • "m"(分钟)
  • "h"(小时)
  • "d"(天)
"0"
"10 ms"
“1秒”
period 指定事件发出的时间间隔,如果它是周期性的 "everyChunk" "everyChunk" ,如果每次文件旋转都应发出周期性事件,否则为正 Long 值的字符串表示形式,后跟一个空格和以下单位之一:
  • "ns"(纳秒)
  • "us"(微秒)
  • "ms"(毫秒)
  • "s"(秒)
  • "m"(分钟)
  • "h"(小时)
  • "d"(天)
"20 ms"
"1 s"
"everyChunk"
stackTrace 指定是否记录来自 Event.commit() 方法的堆栈跟踪 "true" Boolean"true""false")的字符串表示 "true" ,
"false"

空值处理

所有方法都在 Javadoc 中定义它们是接受还是返回 null。通常这表示为 "not null" 。如果在不允许的地方使用 null 参数,则会抛出 java.lang.NullPointerException。如果将 null 参数传递给抛出其他异常的方法,例如 java.io.IOException ,则 java.lang.NullPointerException 优先,除非该方法的 Javadoc 明确说明如何处理 null,即抛出 java.lang.IllegalArgumentException

自从:
9
  • 描述
    描述事件元数据,例如标签、描述和单位。
    事件字段注解,指定该值为布尔标志,truefalse 值。
    事件注解,以人类可读路径的格式将事件类型与类别相关联。
    描述配置的设置和元数据的集合。
    元注解,指定一个注解表示一种内容类型,例如时间跨度或频率。
    事件字段注解,指定一个值表示一个数据量(例如,字节)。
    使用一两句话描述元素的注解。
    事件注解,确定是否应默认启用事件。
    事件的基类,将被子类化以定义事件及其字段。
    用于在运行时定义事件的类。
    将事件设置应用于录音的便利类。
    描述一个事件、它的字段、设置和注解。
    指定元素是实验性的并且可能会更改,恕不另行通知的注解。
    用于访问、控制和管理飞行记录器的类。
    监听Flight Recorder生命周期的回调接口。
    控制访问飞行记录器的权限。
    事件字段注解,指定该值为频率,以 Hz 为单位测量。
    为元素设置人类可读名称的注释(例如,"Maximum Throughput")。
    事件字段注解,指定值为内存地址。
    用于定义新型事件元数据的元注解。
    为元素设置默认名称的注解。
    用于分数的事件字段注解,通常在 0.01.0 之间,以指定该值为百分比。
    事件注解,指定周期性事件的默认设置值。
    提供配置、启动、停止和转储记录数据到磁盘的方法。
    指示录音生命周期中的状态。
    事件注解,用于程序化事件注册。
    关系注释的元注释,用于注解。
    要扩展以创建设置控件的基类。
    指定应使用事件类中的方法来过滤事件的注解。
    描述事件设置。
    事件注解,确定事件默认情况下是否具有堆栈跟踪。
    事件注解,指定不记录事件的默认持续时间(例如,"20 ms")。
    事件字段注解,指定该值为持续时间。
    事件字段注解,指定值为时间点。
    事件字段注解,指定事件从线程转换。
    事件字段注解,指定事件将很快过渡到一个线程。
    事件字段注解,指定该值是无符号数据类型。
    描述事件字段和注解元素。