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開放應用生態