Module jdk.jfr

Package jdk.jfr


package jdk.jfr
该包提供了用于创建事件和控制飞行记录仪的类。

定义事件

飞行记录仪将数据收集为事件。事件具有时间戳、持续时间,通常还有一个应用程序特定的有效负载,用于诊断运行中的应用程序直至发生故障或崩溃。

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

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

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

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

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

控制飞行记录仪

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

设置和配置

设置由名称/值对组成,其中名称指定要配置的事件和设置,指定要设置的内容。

名称可以以下列方式形成:

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

或者

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

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

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

预定义设置

事件设置名称及其用途。
名称 描述 默认值 格式 示例值
enabled 指定事件是否被记录 "true" Boolean的字符串表示("true""false" "true"
"false"
threshold 指定事件不记录的持续时间下限 "0"(无限制) 如果不使用阈值,则为"0",否则为正Long的字符串表示,后跟一个空格和以下单位之一:
  • "ns"(纳秒)
  • "us"(微秒)
  • "ms"(毫秒)
  • "s"(秒)
  • "m"(分钟)
  • "h"(小时)
  • "d"(天)
"0"
"10 ms"
"1 s"
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
  • Class
    Description
    描述事件元数据,如标签、描述和单位。
    事件字段注解,指定值为布尔标志,即truefalse值。
    事件注解,将事件类型与类别关联,格式为人类可读路径。
    一组描述配置的设置和元数据。
    元注解,指定注解表示内容类型,如时间跨度或频率。
    事件字段注解,指定值表示数据量(例如,字节)。
    描述一个元素的注解,使用一两句话描述。
    事件注解,确定事件是否默认启用。
    事件的基类,用于定义事件及其字段。
    用于在运行时定义事件的类。
    用于将事件设置应用于记录的便捷类。
    描述事件、其字段、设置和注解。
    指定元素是实验性的,可能会在不通知的情况下更改的注解。
    用于访问、控制和管理飞行记录仪的基类。
    用于监视飞行记录仪生命周期的回调接口。
    控制访问飞行记录仪的权限。
    事件字段注解,指定值为频率,以Hz为单位。
    为元素设置人类可读名称的注解(例如,"最大吞吐量")。
    事件字段注解,指定值为内存地址。
    用于定义新类型事件元数据的元注解。
    为元素设置默认名称的注解。
    事件字段注解,用于在分数(通常在0.01.0之间)上使用,指定值为百分比。
    事件注解,指定周期性事件的默认设置值。
    提供配置、启动、停止和将记录数据转储到磁盘的方法。
    表示记录生命周期中的状态。
    用于程序化事件注册的事件注解。
    用于关系注解的元注解,用于在注解上使用。
    扩展以创建设置控件的基类。
    指定事件类中的方法应用于过滤事件的注解。
    描述事件设置。
    事件注解,确定事件默认是否具有堆栈跟踪。
    事件注解,指定事件不记录的默认持续时间(例如,"20 ms")。
    事件字段注解,指定值为持续时间。
    事件字段注解,指定值为时间点。
    事件字段注解,指定事件从线程转换。
    事件字段注解,指定事件将很快转换为线程。
    事件字段注解,指定该值为无符号数据类型。
    描述事件字段和注解元素。