内置的JFR(Java飞行记录器)事件记录在哪里?



使用 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事件类的官方文档放在哪里?

事件及其字段布局取决于 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

最新更新