内置 JFR(Java 飞行记录器)事件记录在哪里?
Where are built-in JFR (Java Flight Recorder) events documented?
使用 JDK11,如果您查看 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
它们的名称都与 Java class 包 jdk
中的名称相同。
另一方面,如果我想实现自己的自定义 JFR 事件,我必须扩展 jdk.jfr.Event
class,所以我想所有 jdk.*
事件都扩展了 jdk.jfr.Event
也是。
在官方 Java SE Javadocs (https://docs.oracle.com/en/java/javase/11/docs/api/index.html) 中记录了 jdk.jfr.Event
但 jdk.*
classes 不是.
如果不在官方Java SE平台Java文档中,那么内置JFR事件classes的官方文档在哪里?
事件及其字段布局取决于 JDK 版本。
尽管事件名称看起来像包名称,但 JDK 中的大多数事件并不是使用 Java class 实现的。前缀“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++ classes 的本机事件。java.base / [= 中的事件38=] [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
使用 JDK11,如果您查看 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
它们的名称都与 Java class 包 jdk
中的名称相同。
另一方面,如果我想实现自己的自定义 JFR 事件,我必须扩展 jdk.jfr.Event
class,所以我想所有 jdk.*
事件都扩展了 jdk.jfr.Event
也是。
在官方 Java SE Javadocs (https://docs.oracle.com/en/java/javase/11/docs/api/index.html) 中记录了 jdk.jfr.Event
但 jdk.*
classes 不是.
如果不在官方Java SE平台Java文档中,那么内置JFR事件classes的官方文档在哪里?
事件及其字段布局取决于 JDK 版本。
尽管事件名称看起来像包名称,但 JDK 中的大多数事件并不是使用 Java class 实现的。前缀“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++ classes 的本机事件。java.base / [= 中的事件38=] [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