Java Flight Recorder - 事件机制详解

本篇文章中的源码大部分来自 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 , 按频率采样
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 事件,代码如下:









小结
用户是否可以自定义一个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

参考
后记

本文分享自微信公众号 - openEuler(openEulercommunity)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
「其他文章」
- 玩转机密计算从 secGear 开始
- openEuler资源利用率提升之道06:虚拟机混部OpenStack调度
- openGauss Cluster Manager RTO Test
- JVM 锁 bug 导致 G1 GC 挂起问题分析和解决【毕昇JDK技术剖析 · 第 2 期】
- 手把手带你玩转 openEuler | openEuler 的使用
- 681名学生中选!暑期2021开启火热“开源之夏”!
- 手把手带你玩转 openEuler | 初识 openEuler
- StratoVirt 中的 PCI 设备热插拔实现
- 使用 NMT 和 pmap 解决 JVM 资源泄漏问题
- JNI 中错误的信号处理导致 JVM 崩溃问题分析
- Java Flight Recorder - 事件机制详解
- 毕昇 JDK 8u292、11.0.11 发布!
- StratoVirt 中的虚拟网卡是如何实现的?
- openEuler结合ebpf提升ServiceMesh服务体验的探索
- 我的openEuler社区参与之旅
- StratoVirt 的中断处理是如何实现的?
- 看看毕昇 JDK 团队是如何解决 JVM 中 CMS 的 Crash
- 使用 perf 解决 JDK8 小版本升级后性能下降的问题【毕昇JDK技术剖析 · 第 1 期】
- 2021年毕昇 JDK 的第一个重要更新来了
- 漏洞盒子 × openEuler | 广邀白帽共筑安全的Linux开放应用生态