3.4. 定义和使用自定义事件 API
JDK Flight Recorder (JFR)是一个包含自定义事件 API 的事件记录器。自定义事件 API 存储在 jdk.jfr 模块中,是一种软件接口,使您的应用程序可以与 JFR 通信。
JFR API 包括可用于管理记录和为您的 Java 应用程序、JVM 或操作系统创建自定义事件的类。
在使用自定义事件 API 监控事件前,您必须为自定义事件类型定义名称和元数据。
您可以通过扩展 Event 类来定义 JFR 基础事件,如 Duration、Instant、Requestable 或 Time 事件。具体来说,您可以将字段(如持续时间值)添加到与应用程序有效负载属性定义的数据类型匹配的类中。定义 Event 类后,您可以创建事件对象。
此流程演示了如何将自定义事件类型与 JFR 和 JDK Mission Control (JMC)搭配使用,以分析简单示例程序的运行时性能。
流程
在自定义事件类型中,在
Event类中,使用@name注释来命名自定义事件。此名称显示在 JMC 图形用户界面(GUI)中。在
Event类中定义自定义事件类型名称的示例@Name(“SampleCustomEvent”) public class SampleCustomEvent extends Event {...}定义
Event类及其属性的元数据,如 name、category 和 labels。标签显示客户端的事件类型,如 JMC。注意大型记录文件可能会导致性能问题,这可能会影响您与文件交互的方式。确保正确定义您需要的事件记录注解数量。定义不必要的注解可能会增加您的记录文件的大小。
为示例
事件类定义注解示例@Name(“SampleCustomEvent”)1 @Label("Sample Custom Event") @Category("Sample events") @Description("Custom Event to demonstrate the Custom Events API") @StackTrace(false)2 public class SampleCustomEvent extends Event { @Label("Method")3 public String method; @Label("Generated Number") public int number; @Label("Size") @DataAmount4 public int size; }在
事件类中定义上下文信息。此信息设置自定义事件类型的请求处理行为,以便您可以配置事件类型以收集特定的 JFR 数据。定义简单
主类和事件循环的示例public class Main { private static int requestsSent; public static void main(String[] args) { // Register the custom event FlightRecorder.register(SampleCustomEvent.class); // Do some work to generate the events while (requestsSent <= 1000) { try { eventLoopBody(); Thread.sleep(100); } catch (Exception e) { e.printStackTrace(); } } } private static void eventLoopBody() { // Create and begin the event SampleCustomEvent event = new SampleCustomEvent(); event.begin(); // Generate some data for the event Random r = new Random(); int someData = r.nextInt(1000000); // Set the event fields event.method = "eventLoopBody"; event.number = someData; event.size = 4; // End the event event.end(); event.commit(); requestsSent++; }在前面的示例中,简单
主类注册事件,事件循环会填充事件字段,然后发出自定义事件。在您选择的应用程序中检查事件类型,如 JMC 或 JFR 工具。
图 3.2. 检查 JMC 中的事件类型示例
JFR 记录可以包括不同的事件类型。您可以检查应用程序中的每个事件类型。