Package jdk.jfr
定义事件
飞行记录仪将数据收集为事件。事件具有时间戳、持续时间,通常还有一个应用程序特定的有效负载,用于诊断运行中的应用程序直至发生故障或崩溃。
要定义飞行记录仪事件,需要扩展Event
并添加与有效负载数据类型匹配的字段。关于字段的元数据,如标签、描述和单位,可以通过使用jdk.jfr
包中提供的注解,或者使用具有MetadataDefinition
注解的用户定义注解来添加。
定义事件类之后,可以创建实例(事件对象)。通过将数据分配给字段来存储事件中的数据。通过使用Event
类中提供的begin
和end
方法可以显式控制事件的时间。
收集要存储在事件中的数据可能是昂贵的。可以使用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 的字符串表示,后跟一个空格和以下单位之一:
|
"0" "10 ms" "1 s" |
period |
指定事件定期发出的间隔 | "everyChunk" |
"everyChunk" ,如果应定期发出事件,则为正Long 值的字符串表示,后跟一个空格和以下单位之一:
|
"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
-
ClassDescription描述事件元数据,如标签、描述和单位。事件字段注解,指定值为布尔标志,即
true
或false
值。事件注解,将事件类型与类别关联,格式为人类可读路径。一组描述配置的设置和元数据。元注解,指定注解表示内容类型,如时间跨度或频率。事件字段注解,指定值表示数据量(例如,字节)。描述一个元素的注解,使用一两句话描述。事件注解,确定事件是否默认启用。事件的基类,用于定义事件及其字段。用于在运行时定义事件的类。用于将事件设置应用于记录的便捷类。描述事件、其字段、设置和注解。指定元素是实验性的,可能会在不通知的情况下更改的注解。用于访问、控制和管理飞行记录仪的基类。用于监视飞行记录仪生命周期的回调接口。控制访问飞行记录仪的权限。事件字段注解,指定值为频率,以Hz为单位。为元素设置人类可读名称的注解(例如,"最大吞吐量"
)。事件字段注解,指定值为内存地址。用于定义新类型事件元数据的元注解。为元素设置默认名称的注解。事件字段注解,用于在分数(通常在0.0
和1.0
之间)上使用,指定值为百分比。事件注解,指定周期性事件的默认设置值。提供配置、启动、停止和将记录数据转储到磁盘的方法。表示记录生命周期中的状态。用于程序化事件注册的事件注解。用于关系注解的元注解,用于在注解上使用。扩展以创建设置控件的基类。指定事件类中的方法应用于过滤事件的注解。描述事件设置。事件注解,确定事件默认是否具有堆栈跟踪。事件注解,指定事件不记录的默认持续时间(例如,"20 ms"
)。事件字段注解,指定值为持续时间。事件字段注解,指定值为时间点。事件字段注解,指定事件从线程转换。事件字段注解,指定事件将很快转换为线程。事件字段注解,指定该值为无符号数据类型。描述事件字段和注解元素。