無意間做了個 web 版的 JVM 監控端前後端分離 React+Spring Boot

本來就是為了更多的瞭解 JMX,第一步就想把所有的 MBean 和屬性都展示出來,開始在控制檯輸出,但是效果不好,內容太多太長,不夠直觀,然後就加了個 web 端的樹形結構。然後做著做著突然發現,再稍微改改就能當個 web 版的簡易監控端用了。

此工具只在 hotspot JVM 8 環境下測試過。可支持查看本地 JVM 和 遠程 JVM 實時監控。

前端採用 React 16 + Antd + Yarn ,後端 Spring Boot + Java 1.8。具體使用方式可以到 github 倉庫 README 頁面查看。並且提供了一個在線預覽版本,文末有源碼地址和在線版本的使用方式。

無意間做了個 web 版的 JVM 監控端前後端分離 React+Spring Boot

支持本地 JVM 和遠程 JVM 鏈接。

無意間做了個 web 版的 JVM 監控端前後端分離 React+Spring Boot

所有 MBean 的樹形展示以及屬性、操作的展示。

無意間做了個 web 版的 JVM 監控端前後端分離 React+Spring Boot

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。這些都要單獨處理。

無意間做了個 web 版的 JVM 監控端前後端分離 React+Spring Boot

常用的 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 獲取。


分享到:


相關文章: