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