如何解决内置的JFRJava Flight Recorder事件在哪里记录?
使用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
。 / p>
在正式的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”工具查看元数据。
$ java -XX:StartFlightRecordering:filename=m.jfr -version
$ jfr metadata m.jfr.
即使实际事件是通过其他方式定义的,输出仍将使用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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。