【问题标题】:Where are built-in JFR (Java Flight Recorder) events documented?内置 JFR(Java Flight Recorder)事件记录在哪里?
【发布时间】:2020-10-31 20:11:28
【问题描述】:

使用 JDK 11,如果查看 JRF 记录的摘要,可以看到有 140 个不同的事件。其中一些可能没有发生,这在输出中清晰可见:

$ jfr summary /c/dev/jfrec/ddos.jfr

 Version: 2.0
 Chunks: 1
 Start: 2020-10-31 19:39:36 (UTC)
 Duration: 54 s

 Event Type                              Count  Size (bytes)
=============================================================
 jdk.JavaMonitorWait                      2727         79342
 jdk.NativeMethodSample                   2590         40722
 jdk.ThreadPark                           2125         89947
 ...
 jdk.GCHeapConfiguration                     1            30
 jdk.YoungGenerationConfiguration            1            21
 jdk.JavaMonitorInflate                      0             0
 jdk.ReservedStackActivation                 0             0

它们的名称都像是 jdk 包中的 Java 类。

另一方面,如果我想实现自己的自定义 JFR 事件,我必须扩展 jdk.jfr.Event 类,所以我想所有 jdk.* 事件也都扩展 jdk.jfr.Event

在官方 Java SE Javadocs (https://docs.oracle.com/en/java/javase/11/docs/api/index.html) 中记录了 jdk.jfr.Event,但 jdk.*没有

如果不在官方 Java SE 平台 Javadocs 中,那么内置 JFR 事件类的官方文档放在哪里?

【问题讨论】:

    标签: java java-11 jfr


    【解决方案1】:

    事件及其字段布局取决于 JDK 版本。

    尽管事件名称看起来像包名称,但 JDK 中的大多数事件都不是使用 Java 类实现的。前缀“jdk”。仅用于将它们与用户定义的事件区分开来。

    如果您想查看特定 JDK 支持的内容,可以使用“jfr”工具查看元数据。

    JDK 11-16:

    $ java -XX:StartFlightRecording:filename=m.jfr -version
    $ jfr metadata m.jfr.
    

    JDK 17 及更高版本:

    $ jfr metadata 
    

    输出将采用 Java 语法,即使实际事件是通过其他方式定义的。

    @Name("jdk.CPUInformation")
    @Category({"Operating System", "Processor"})
    @Label("CPU Information")
    class CPUInformation extends jdk.jfr.Event {
      @Label("Start Time")
      @Timestamp("TICKS")
      long startTime;
    
      @Label("Type")
      String cpu;
    
      @Label("Description")
      String description;
    
      @Unsigned
      @Label("Sockets")
      int sockets;
    
      @Unsigned
      @Label("Cores")
      int cores;
    
      @Unsigned
      @Label("Hardware Threads")
      int hwThreads;
    }
    

    (如果您对实现感兴趣,有从 XML 描述[1] 生成的 C++ 类的本机事件。java.base / jdk.internal.event [2] 中的事件缺少元数据,但使用添加镜像位于 jdk.jfr / jdk.jfr.events [3] 中的事件,您还可以在其中找到一些用 Java 实现的事件。

    [1]https://github.com/openjdk/jdk/blob/master/src/hotspot/share/jfr/metadata/metadata.xml

    [2]https://github.com/openjdk/jdk/tree/master/src/java.base/share/classes/jdk/internal/event

    [3]https://github.com/openjdk/jdk/tree/master/src/jdk.jfr/share/classes/jdk/jfr/events

    【讨论】:

      猜你喜欢
      • 2022-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多