Java Flight Recorder - 事件機制詳解
![](http://oscimg.oschina.net/oscnet/5d2ce90c-5cb7-430a-a400-97b6f35cc6ed.png)
本篇文章中的源碼大部分來自 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
![](http://oscimg.oschina.net/oscnet/bac3397a-7181-45c8-bf0d-c369682235e7.png)
一個事件的生命週期
![](http://oscimg.oschina.net/oscnet/924a1b91-5c0a-4678-90b6-a9e0e9162b06.png)
![](http://oscimg.oschina.net/oscnet/bb3062c6-0315-433a-b943-44b3980bbd9d.png)
我們簡單地挑一個 Thread Start 的事件,關注一下它的整個被觸發到被記錄的過程。在線程創建並執行時會調用記錄 JFR 事件,代碼如下:
![](http://oscimg.oschina.net/oscnet/f26f2398-1899-457f-a361-f6a552604413.png)
![](http://oscimg.oschina.net/oscnet/5c8ff5d8-c3a5-4548-b03b-e99dfeb6e7f7.png)
![](http://oscimg.oschina.net/oscnet/e3b6ce63-2077-4c68-adc6-27c64102ce6d.png)
![](http://oscimg.oschina.net/oscnet/bf36e20d-b4bc-45f6-bebf-239aa0a37fb5.png)
![](http://oscimg.oschina.net/oscnet/fb89f2c3-506d-44fb-8255-0681dadf47d6.png)
![](http://oscimg.oschina.net/oscnet/bb7814e9-6677-4717-bcc6-f3d4fe1288e1.png)
![](http://oscimg.oschina.net/oscnet/d744955a-69d2-4273-b41b-7d19b7fb9017.png)
![](http://oscimg.oschina.net/oscnet/5c400e83-a9ea-47df-aa4f-230810327f4b.png)
![](http://oscimg.oschina.net/oscnet/bac3397a-7181-45c8-bf0d-c369682235e7.png)
小結
用户是否可以自定義一個JFR 事件?注意點有哪些?
![](http://oscimg.oschina.net/oscnet/03078c6a-edbd-4455-85dd-2f4ea89a8dd3.png)
> 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.
![](http://oscimg.oschina.net/oscnet/adcdd0fe-f733-48ce-bed7-c162b8835b92.png)
$> java Viewer | less
![](http://oscimg.oschina.net/oscnet/26591f6b-729c-47cc-9a24-fb68d40c61ac.png)
參考
後記
![](http://oscimg.oschina.net/oscnet/c20c97a9-5c17-414d-b94f-d27847520a8f.png)
本文分享自微信公眾號 - 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開放應用生態