之前寫了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 系統就是不一樣的,需要單獨編譯。在使用的時候,需要下載源碼,在本地編譯,然后運行。
有興趣的不妨試用一下,歡迎拍磚。
不要吝惜你的「推薦」呦
歡迎關注,不定期更新本系列和其他文章
古時的風箏
,進入公眾號可以加入交流群