Java Flight Recorder(简称为JFR)曾经是 Oracle JDK 商业版的附属组件,在 JDK 11 中正式开源,后又被移植到 JDK8 中。JFR对应用的侵入性很小,同时又能提供应用运行时相对准确和丰富的信息;合理使用该工具可以极大地提高工作效率。本文剖析JFR的事件机制,希望能帮助大家从原理上理解 JFR ,进而能正确使用 JFR。
-
本篇文章中的源码大部分来自 openjdk8u262;
-
本文出发点是梳理 JFR 的事件机制,侧重点在于理解而非应用
对于JFR我们有着怎样的预期
-
提供一些API用于产生数据或消费数据
-
提供缓存机制和二进制数据格式
-
允许配置和过滤事件
-
为 OS、JVM、JDK 库提供相应的事件
从中,我们能粗略地获取这些信息 :
-
事件以自描述的二进制形式(.jfr)被保存着
-
事件中包含了数据,事件 ≈ 数据
-
.jfr 文件 => read by some Provided API => 重现运行时数据 [ => 可视化]
JFR是事件驱动的
-
Instant Event , 发生就收集(e.g. Thread Start …)
-
Duration Event, 持续收集一段时间(e.g. GC Event …)
-
Timed Event , 收集超过指定时间的事件
-
Sample Event , 按频率采样
: 98 80 80 00 87 02 95 ae e4 b2 92 03 a2 f7 ae 9a 94 02 02 01 8d 11 00 00
-
Event Size : 98 80 80 00
-
Event ID : 87 02
-
TimeStamp : 95 ae e4 b2 92 03
-
Duration : a2 f7 ae 9a 94 02
-
Thread ID : 02
-
Stack trace ID : 01
-
PayLoad(记录的数据,fields 取决于各个 Event 类型):
-
加载的类 : 8d 11
-
定义类的 ClassLoader : 00
-
初始化类的 ClassLoader : 00
一个事件的生命周期
我们简单地挑一个 Thread Start 的事件,关注一下它的整个被触发到被记录的过程。在线程创建并执行时会调用记录 JFR 事件,代码如下:
JEP 328
中有一个更为简单直接例子,如下:
我们只需关注这个事件生成的结构:
小结
用户是否可以自定义一个JFR 事件?注意点有哪些?
> java -XX:StartFlightRecording,filename=event.jfr Test
Started recording 1. No limit specified, using maxsize=250MB as default.
Use jcmd 57980 JFR.dump name=1 to copy recording data to file.
$> java Viewer | less
参考
https://adoptopenjdk.net/jmc.html
后记
本文分享自微信公众号 – openEuler(openEulercommunity)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
{{m.name}}
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/72252.html