無意間做了個 web 版的 JVM 監控端(前後端分離 React+Spring Boot)
- 2019 年 10 月 15 日
- 筆記
之前寫了JConsole、VisualVM 依賴的 JMX 技術,然後放出了一個用純 JMX 實現的 web 版本的 JConsole 的截圖,今天源碼來了。
本來就是為了更多的了解 JMX,第一步就想把所有的 MBean 和屬性都展示出來,開始在控制台輸出,但是效果不好,內容太多太長,不夠直觀,然後就加了個 web 端的樹形結構。然後做著做著突然發現,再稍微改改就能當個 web 版的簡易監控端用了。
此工具只在 hotspot JVM 8 環境下測試過。可支援查看本地 JVM 和 遠程 JVM 實時監控。
前端採用 React 16 + Antd + Yarn ,後端 Spring Boot + Java 1.8。具體使用方式可以到 github 倉庫 README 頁面查看。並且提供了一個在線預覽版本,文末有源碼地址和在線版本的使用方式。
支援本地 JVM 和遠程 JVM 鏈接。
所有 MBean 的樹形展示以及屬性、操作的展示。
JVM 運行情況實時展示
實現的功能有如下幾個方面:
1.所有 MBean 的展示;
2.系統資訊的展示,包括記憶體使用、CPU 使用率等等;
3.JVM 參數,包括命令行參數和 systemProperties;
4.CPU 、Heap、Metaspace、類載入、執行緒的實時折線圖;
5.垃圾收集器的種類和回收次數;
下面結合這幾部分,說一下 JMX 的使用方式。
MBean 的獲取
正如各種工具里的 MBean 的樹形展示方式一樣, MBean 本身就是以這種層級關係存在的。
MBean 包含在 Domain 里,Domain 相當於是一套獨立的空間,這個空間里可以定義各種 type,各種 name 的 ObjectName。比如前一篇 JMX 文章里自定義的那個。
通過 ObjectName 可以獲取到 MBean 的各種資訊,包括屬性、操作、通知。
有些屬性是簡單數據類型,比如 int、long、double、String 類型,另外有些是比較複雜的,比方說 com.sun.management:type=HotSpotDiagnostic 的屬性 DiagnosticOptions 就是 javax.management.openmbean.CompositeData 類型。還有的屬性的數據類型是 javax.management.openmbean.TabularData。這些都要單獨處理。
常用的 MBean
有些指標是監控會用到的,比如記憶體、CPU、堆空間、執行緒、類載入情況相關的 MBean。
JDK 提供了一個 ManagementFactory,幫助我們方便的獲取常用的 MBean。可以到 java.lang.management 包下找到這個類看一下注釋和程式碼。
OperatingSystemMXBean
可以獲取作業系統相關的資訊,機器名稱、記憶體使用、CPU使用等資訊。
可通過 ManagementFactory.getOperatingSystemMXBean()
方式獲取。
RuntimeMXBean
可以獲取當前 JVM 的資訊,包括 JVM 參數和 JVM 相關的系統參數。
可以通過 ManagementFactory.getRuntimeMXBean()
方式獲取。
MemoryMXBean
可以獲取當前 JVM 的記憶體使用,包括堆記憶體和非堆記憶體。
可以通過 ManagementFactory.getMemoryMXBean()
獲取
ThreadMXBean
獲取 JVM 執行緒使用情況,包括活動執行緒、守護執行緒、執行緒峰值等。
可以通過 ManagementFactory.getThreadMXBean()
獲取。
ClassLoadingMXBean
獲取 JVM 類載入情況,包括已載入類、未載入類等。
可以通過 ManagementFactory.getClassLoadingMXBean()
獲取。
GarbageCollectorMXBean
獲取 JVM 垃圾收集器的情況,包括使用的哪種垃圾收集器以及回收次數等等。
可以通過 ManagementFactory.getGarbageCollectorMXBeans()
獲取,注意,這裡獲取到的是一個集合,因為垃圾收集器分為老年代和新生代兩個。
除了以上幾個常用的 MBean ,還有很多其他的。有些在 ManagementFactory 類里已提供了,另外還有很多需要自己通過 ObjectName 獲取。
在線體驗
我在伺服器上部署了一個體驗版本。因為伺服器配置實在慘的可憐,所以需要在本公眾號內回復「jmx」獲取體驗驗證碼和在線地址。
公眾號:「古時的風箏」或者掃描文末的二維碼
源碼地址
源碼放到了 github 上,地址為 https://github.com/huzhicheng/little-flower, README 上有具體的使用方式。因為各個作業系統下的 JVM 也是不一樣的,windows、Mac、Linux 也是不能通用的,所以,沒有提供可用的 release jar 包。比如我開發用的 Mac 和體驗環境 Linux 系統就是不一樣的,需要單獨編譯。在使用的時候,需要下載源碼,在本地編譯,然後運行。
有興趣的不妨試用一下,歡迎拍磚。
不要吝惜你的「推薦」呦
歡迎關注,不定期更新本系列和其他文章
古時的風箏
,進入公眾號可以加入交流群