文章目錄
- 前言
- 一、JMC介紹
- 二、JFR資料記錄
- 結尾
前言
Java Mission Control,曾經是大名鼎鼎的來自BEA公司的圖形化診斷工具,隨著BEA公司被Oracle收購,它便被融合進OracleJDK之中,在JDK 7 Update 40時開始隨JDK一起發布,后來Java SE Advanced產品線建立, Oracle明確區分了Oracle OpenJDK和OracleJDK的差別, JMC從JDK 11開始又被移除出JDK,雖然在2018年Oracle將JMC開源并交付給OpenJDK組織進行管理,但開源并不意味著免費使用, JMC需要與HotSpot內部的“飛行記錄儀”(Java Flight Recorder, JFR)配合才能作業,而在JDK 11以前, JFR的開啟必須解鎖OracleJDK的商業特性支持(使用JCMD的VM.unlock_commercial_features或啟動時加入-XX: +UnlockCommercialFeatures引數),所以這項功能在生產環境中仍然是需要付費才能使用的商業特性,
一、JMC介紹
除了大家熟知的面向通用計算(General Purpose Computing)可免費使用的Java SE外,Oracle公司還開辟過帶商業技術支持的Oracle Java SE Support和面向獨立軟體供應商(ISV)的Oracle Java SE Advanced & Suite產品線,
除去帶有7×24小時的技術支持以及可以為企業專門定制安裝包這些非技術類的增強服務外,Oracle Java SE Advanced & Suite與普通Oracle Java SE在功能上的主要差別是前者包含了一系列的監控、管理工具,例如用于企業JRE定制管理的AMC(Java Advanced Management Console)控制臺、JUT(Java Usage Tracker)跟蹤系統,用于持續收集資料的JFR(Java Flight Recorder)飛行記錄儀和用于監控Java虛擬機的JMC(Java Mission Control),這些功能全部都是需要商業授權才能在生產環境中使用,但根據Oracle Binary Code協議,在個人開發環境中,允許免費使用JMC和JFR,本節筆者將簡要介紹它們的原理和使用,
JFR是一套內建在HotSpot虛擬機里面的監控和基于事件的資訊搜集框架,與其他的監控工具(如JProfiling)相比,Oracle特別強調它“可持續在線”(Always-On)的特性,JFR在生產環境中對吞吐量的影響一般不會高于1%(甚至號稱是Zero Performance Overhead),而且JFR監控程序的開始、停止都是完全可動態的,即不需要重啟應用,JFR的監控對應用也是完全透明的,即不需要對應用程式的原始碼做任何修改,或者基于特定的代理來運行,
JMC最初是BEA公司的產品,因此并沒有像VisualVM那樣一開始就基于自家的Net-Beans平臺來開發,而是選擇了由IBM捐贈的Eclipse RCP作為基礎框架,現在的JMC不僅可以下載到獨立程式,更常見的是作為Eclipse的插件來使用,JMC與虛擬機之間同樣采取JMX協議進行通信,JMC一方面作為JMX控制臺,顯示來自虛擬機MBean提供的資料;另一方面作為JFR的分析工具,展示來自JFR的資料,啟動后JMC的主界面如圖所示,

在左側的“JVM瀏覽器”面板中自動顯示了通過JDP協議(Java Discovery Protocol)找到的本機正在運行的HotSpot虛擬機行程,如果需要監控其他服務器上的虛擬機,可在“檔案->連接”選單中創建遠程連接,如圖所示,

這里要填寫的資訊應該在被監控虛擬機行程啟動的時候以虛擬機引數的形式指定,以下是一份被監控端的啟動引數樣例:
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=192.168.31.4
-XX:+UnlockCommercialFeatures -XX:+FlightRecorder
本地虛擬機與遠程虛擬機行程的差別只限于創建連接這個步驟,連接成功創建以后的操作就是完全一樣的了,把“JVM瀏覽器”面板中的行程展開后,可以看到每個行程的資料都有MBean和JFR兩個資料來源,關于MBean這部分資料,與JConsole和VisualVM上取到的內容是一樣的,只是展示形式上有些差別,就不再重復了,后面著重介紹JFR的資料記錄,
二、JFR資料記錄
雙擊“飛行記錄器”,將會出現“啟動飛行記錄”視窗(如果第一次使用,還會收到解鎖商業功能的警告窗),如圖所示,

在啟動飛行記錄時,可以進行記錄時間、垃圾收集器、編譯器、方法采樣、執行緒記錄、例外記錄、網路和檔案I/O、事件記錄等選項和頻率設定,這部分比較瑣碎,筆者就不一一截圖講解了,點擊“完成”按鈕后馬上就會開始記錄,記錄時間結束以后會生成飛行記錄報告,如圖所示,

飛行記錄報告里包含以下幾類資訊:
- 一般資訊:關于虛擬機、作業系統和記錄的一般資訊,
- 記憶體:關于記憶體管理和垃圾收集的資訊,
- 代碼:關于方法、例外錯誤、編譯和類加載的資訊,
- 執行緒:關于應用程式中執行緒和鎖的資訊,
- I/O:關于檔案和套接字輸入、輸出的資訊,
- 系統:關于正在運行Java虛擬機的系統、行程和環境變數的資訊,
- 事件:關于記錄中的事件型別的資訊,可以根據執行緒或堆疊跟蹤,按照日志或圖形的格式查看,
JFR的基本作業邏輯是開啟一系列事件的錄制動作,當某個事件發生時,這個事件的所有背景關系資料將會以回圈日志的形式被保存至記憶體或者指定的某個檔案當中,回圈日志相當于資料流被保留在一個環形快取中,所以只有最近發生的事件的資料才是可用的,JMC從虛擬機記憶體或者檔案中讀取并展示這些事件資料,并通過這些資料進行性能分析,
即使不考慮對被測驗程式性能影響方面的優勢,JFR提供的資料質量通常也要比其他工具通過代理形式采樣獲得或者從MBean中取得的資料高得多,以垃圾搜集為例,HotSpot的MBean中一般有各個分代大小、收集次數、時間、占用率等資料(根據收集器不同有所差別),這些都屬于“結果”類的資訊,而JFR中還可以看到記憶體中這段時間分配了哪些物件、哪些在TLAB中(或外部)分配、分配速率和壓力大小如何、分配歸屬的執行緒、收集時物件分代晉升的情況等,這些就是屬于“程序”類的資訊,對排查問題的價值是難以估量的,
結尾
- 感謝大家的耐心閱讀,如有建議請私信或評論留言,
- 如有識訓,勞煩支持,關注、點贊、評論、收藏均可,博主會經常更新,與大家共同進步
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297237.html
標籤:其他
