3.4. 定义和使用自定义事件 API


JDK Flight Recorder (JFR)是一个包含自定义事件 API 的事件记录器。自定义事件 API 存储在 jdk.jfr 模块中,是一种软件接口,使您的应用程序可以与 JFR 通信。

JFR API 包括可用于管理记录和为您的 Java 应用程序、JVM 或操作系统创建自定义事件的类。

在使用自定义事件 API 监控事件前,您必须为自定义事件类型定义名称和元数据。

您可以通过扩展 Event 类来定义 JFR 基础事件,如 DurationInstantRequestableTime 事件。具体来说,您可以将字段(如持续时间值)添加到与应用程序有效负载属性定义的数据类型匹配的类中。定义 Event 类后,您可以创建事件对象。

此流程演示了如何将自定义事件类型与 JFR 和 JDK Mission Control (JMC)搭配使用,以分析简单示例程序的运行时性能。

流程

  1. 在自定义事件类型中,在 Event 类中,使用 @name 注释来命名自定义事件。此名称显示在 JMC 图形用户界面(GUI)中。

    Event 类中定义自定义事件类型名称的示例

    @Name(“SampleCustomEvent”)
    public class SampleCustomEvent extends Event {...}
    Copy to Clipboard Toggle word wrap

  2. 定义 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")
        @DataAmount 
    4
    
        public int size;
    }
    Copy to Clipboard Toggle word wrap

    1
    详情注解,如 @Name,用于定义 JMC GUI 上如何显示自定义事件的元数据。
    2
    @StackTrace 注释会增加 flight 记录的大小。默认情况下,JFR 不包含为事件创建的位置的 stackTrace
    3
    @Label 注释定义各个方法的参数,如 HTTP 请求的资源方法。
    4
    @DataAmount 注释包含一个属性,它以字节为单位定义数据量。JMC 会自动以其他单位呈现数据量,如 MB (MB)。
  3. 事件 类中定义上下文信息。此信息设置自定义事件类型的请求处理行为,以便您可以配置事件类型以收集特定的 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++;
        }
    Copy to Clipboard Toggle word wrap

    在前面的示例中,简单 类注册事件,事件循环会填充事件字段,然后发出自定义事件。

  4. 在您选择的应用程序中检查事件类型,如 JMC 或 JFR 工具。

    图 3.2. 检查 JMC 中的事件类型示例

    JFR 记录可以包括不同的事件类型。您可以检查应用程序中的每个事件类型。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat