Package jdk.jfr
定义事件
Flight Recorder将数据收集为事件。 事件具有时间戳,持续时间以及通常是特定于应用程序的有效负载,可用于诊断运行的应用程序直至故障或崩溃。
要定义Flight Recorder事件,请扩展Event
并添加与有效内容的数据类型匹配的字段。 可以使用jdk.jfr
包中提供的注释或使用具有MetadataDefinition
注释的用户定义注释来添加有关字段(例如标签,描述和单位)的元数据。
定义事件类后,可以创建实例(事件对象)。 通过将数据分配给字段来将数据存储在事件中。 可以使用Event
类中提供的begin
和end
方法显式控制事件计时。
收集要存储在事件中的数据可能很昂贵。 Event.shouldCommit()
方法可用于验证在调用Event#commit()
方法时是否实际将事件实例写入系统。 如果Event.shouldCommit()
返回false
,则可以避免这些操作。
有时,在编译时不知道事件的字段布局。 在这种情况下,可以动态定义事件。 但是,动态事件可能与静态定义的事件没有相同的性能级别,并且工具可能无法在不知道布局的情况下识别和可视化数据。
动态地定义的事件时,使用EventFactory
类,并通过使用定义字段ValueDescriptor
类,并通过使用定义注解AnnotationElement
类。 使用工厂分配事件,使用Event.set(int, Object)
方法填充它。
控制飞行记录器
可以使用jcmd
命令行工具在本地控制Flight Recorder,也可以使用在平台MBeanServer中注册的FlightRecorderMXBean
接口远程控制。 当需要直接编程访问时,可以通过调用FlightRecorder.getFlightRecorder()
和使用Recording
类创建的记录来获取Flight Recorder实例,从中配置要记录的数据量。
设置和配置
设置由名称/值对组成,其中name指定要配置的事件和设置, 值指定要将其设置为的内容。
名称可以通过以下方式形成:
<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()
获取事件类型的可用设置列表。
预定义的设置
Event setting names and their purpose. Name Description Default value Format Example valuesenabled
Specifies whether the event is recorded "true"
String representation of a Boolean
("true"
or "false"
) "true"
"false"
threshold
Specifies the duration below which an event is not recorded "0"
(no limit) "0"
if no threshold is used, otherwise a string representation of a positive Long
followed by a space and one of the following units:
"ns"
(nanoseconds)"us"
(microseconds)"ms"
(milliseconds)"s"
(seconds)"m"
(minutes)"h"
(hours)"d"
(days)
"0"
"10 ms"
"1 s"
period
Specifies the interval at which the event is emitted, if it is periodic "everyChunk"
"everyChunk"
, if a periodic event should be emitted with every file rotation, otherwise a string representation of a positive Long
value followed by an empty space and one of the following units:
"ns"
(nanoseconds)"us"
(microseconds)"ms"
(milliseconds)"s"
(seconds)"m"
(minutes)"h"
(hours)"d"
(days)
"20 ms"
"1 s"
"everyChunk"
stackTrace
Specifies whether the stack trace from the Event#commit()
method is recorded "true"
String representation of a Boolean
("true"
or "false"
) "true"
,"false"
空操作
所有方法都定义它们是否接受或返回Javadoc中的null
。 通常,这表示为"not null"
。 如果在null
情况下使用null
参数,则抛出java.lang.NullPointerException
。 如果将null
参数传递给抛出其他异常的方法(例如java.io.IOException
,则java.lang.NullPointerException
优先,除非该方法的Javadoc明确说明null
的处理方式,即抛出java.lang.IllegalArgumentException
。
- 从以下版本开始:
- 9
-
接口摘要 接口 描述 FlightRecorderListener 用于监控Flight Recorder生命周期的回调接口。 -
类摘要 类 描述 AnnotationElement 描述事件元数据,例如标签,描述和单元。Configuration 描述配置的设置和元数据的集合。Event 事件的基类,要进行子类化以定义事件及其字段。EventFactory 用于在运行时定义事件的类。EventSettings 将事件设置应用于录制的便捷类。EventType 描述事件,其字段,设置和注释。FlightRecorder 用于访问,控制和管理Flight Recorder的类。FlightRecorderPermission 控制对Flight Recorder的访问权限。Recording 提供配置,启动,停止和将记录数据转储到磁盘的方法。SettingControl 要扩展的基类以创建设置控件。SettingDescriptor 描述事件设置。ValueDescriptor 描述事件字段和注释元素。 -
枚举摘要 Enum 描述 RecordingState 表示录制生命周期中的状态。 -
注解类型摘要 Annotation Type 描述 BooleanFlag 事件字段注释,指定该值是布尔标志,true
或false
值Category 事件注释,以人类可读路径的格式将事件类型与类别相关联。ContentType 元注释指定注释表示内容类型,例如时间跨度或频率。DataAmount 事件字段注释指定值表示数据量(例如,字节)。描述 使用一两句话描述元素的注释。Enabled 事件注释,确定是否应默认启用事件。Experimental 注释,指定元素是实验性的,可能会更改,恕不另行通知。Frequency 事件字段注释指定该值是以Hz为单位测量的频率。Label 为元素设置人类可读名称的注释(例如,"Maximum Throughput"
)。MemoryAddress 事件字段注释,指定该值是内存地址。MetadataDefinition 用于定义新类型的事件元数据的元注释。Name 覆盖元素的默认名称的注释(例如,当事件的默认包不合适时)。Percentage 要在分数上使用的事件字段注释(通常在0.0
和1.0
之间),以指定该值是百分比。Period 事件注释,指定周期性事件的默认设置值。Registered 事件注释,用于程序化事件注册。Relational 关系注释的元注释,用于注释。SettingDefinition 注释,指定应使用事件类中的方法过滤掉事件。StackTrace 事件注释,确定默认情况下事件是否具有堆栈跟踪。Threshold 事件注释,指定未记录事件的默认持续时间(例如,"20 ms"
)。Timespan 事件字段注释,指定值是持续时间。Timestamp 事件字段注释,指定值是一个时间点。TransitionFrom 事件字段注释,指定从线程转换的事件。TransitionTo 事件字段注释,指定事件将很快转换为线程。Unsigned 事件字段注释指定该值是无符号数据类型。