A. 使用 JMX 監控和管理 java 程序
主題 JMX
本文講解Java JMX技術的相關概念和實際應用。
本文章屬於Java性能分析優化系列文章,點擊話題可查看所有文章。
1. JMX是什麼?
Java Management Extensions(JMX)是Java SE平台的標准功能,提供了一種簡單且標准化的資源監控和管理方式。它定義了資源的結構和模式,主要用於監控和管理Java應用程序運行狀態、設備和資源信息以及Java虛擬機運行情況。JMX的動態性使其能夠在資源創建、安裝、實現時進行動態監控和管理。JDK自帶的jconsole就是基於JMX技術的監控工具。
在使用JMX技術時,通過定義一個MBean(或MXBean)的Java對象來表示要管理的資源,並將其注冊到MBean Server,對外提供服務。MBean Server作為代理,負責對外提供服務和對內管理MBean資源,實現了資源管理和MBean Server的完全獨立控制。
JMX不僅適用於本地管理,還通過JMX Remote API擴展了遠程功能,使其能夠通過網路遠程監視和管理應用程序。
2. 為何使用JMX技術?
JMX技術為Java開發者提供了一種簡單、靈活且標准化的資源監控方式,得益於其相對獨立的架構設計,JMX能輕松集成到各種監控系統中。
JMX的具體優點包括:
3. JMX的技術架構
JMX架構由資源管理(MBean/MXBean)、資源代理(MBean Server)和遠程管理(Remote API)組成。下圖展示了三個模塊之間的關系。
3.1. 資源管理MBean
資源管理是架構中的資源探測層(Probe Level),在JMX中,使用MBean或MXBean表示資源,訪問和管理資源都通過MBean,MBean包含資源的屬性和操作方法。
JMX已經為JVM提供了多維度資源檢測,可以輕松啟動JMX代理訪問內置的JVM資源檢測,從而實現遠程監控和管理JVM。
以下是JMX對JVM資源檢測類的示例代碼。
運行後得到結果如下:
3.2. 資源代理MBean Server
MBean Server是MBean資源的代理,通過MBean Server可以實現MBean資源的遠程管理。MBean資源和MBean Server通常在同一JVM中,但不是強制要求。
為了使MBean Server管理MBean資源,需要將資源注冊到MBean Server。任何符合JMX規范的MBean資源都可以進行注冊,MBean Server會暴露遠程通信介面對外提供服務。
3.3. JMX遠程管理
可以通過HTTP協議、SNMP協議、RMI遠程調用協議等網路協議訪問JMX API,JMX技術默認實現了RMI遠程調用協議。
由於資源管理MBean的充分解耦,可以輕松將資源管理功能擴展到其他協議,如通過HTTP在網頁端進行管理。
4. JMX的具體使用
在資源管理MBean部分已經展示了使用JMX獲取JVM運行信息,那麼如何自定義資源MBean呢?
下面通過一個例子,模擬一個內存資源MBean,最後實現遠程管理。
4.1. 編寫資源管理MBean
MBean的編寫遵循JMX設計規范,MBean類似於特殊的Java Bean,需要介面和實現類。MBean資源介面以MBean或MXBean結尾,實現類以介面去掉MBean或MXBean後的名字命名。
編寫一個內存資源管理MBean介面如下:
然後實現這個介面:
這樣就完成了線程數量資源MBean的創建,其中total和used是資源屬性,doMemoryInfo是資源操作方法。
4.2. 注冊資源到MBean Server
通過上述JMX架構圖,我們知道MBean資源需要注冊到MBean Server進行代理才能暴露給外部調用。為了通過遠程管理自定義的MyMemory資源,需要先進行資源代理。
啟動後可以看到控制台每三秒列印我們自定義的內存信息。
不加任何JVM參數啟動Java程序,JMX只能在當前機器訪問,若要通過網路實現真正的遠程訪問,需要指定當前機器IP和開放埠。
4.3. 遠程管理jconsole
jconsole是Java自帶的基於JMX技術的監控管理工具,若已配置JDK環境變數,可通過控制台運行jconsole命令啟動。
啟動jconsole後列出當前機器上的Java進程,選擇要監控的Java進程進行監控,連接後提示不安全的協議,原因是Java程序默認啟動不配置HTTPS協議。
連接後可以看到多維度的JVM監控信息,這些信息通過讀取JVM資源MBean信息獲得。
在下面的頁面展示了線程信息,注意最下面的線程信息,可以看到RMI TCP線程,這證明了JMX默認通過RMI協議進行遠程管理。
在MBean頁面可以瀏覽所有可管理的MBean信息,也可以看到我們自定義的com.wdbyte.jmx中的內存信息,甚至可以直接修改其中的used變數。
修改後控制台日誌立即發生變化,已修改成功。
在操作中可以調用doMemoryInfo方法,調用後可以看到返回值中使用內存已從啟動時的20MB更新為30MB。
以上代碼示例存放在github.com/niumoo/JavaN...
當前系列:
---- E ND ----
分享一波面試資料,請點擊鏈接加入群聊【馬士兵官方java編程學】:
B. 必須要會的JVM性能監測工具(JVisualVM)
JVisualVM是Java開發者必須要掌握的JVM性能監測工具,其主要特點和功能如下:
監控垃圾收集過程:JVisualVM能夠實時監控Java虛擬機的垃圾收集活動,幫助開發者了解內存管理情況。
包含JDK自帶命令功能:它幾乎涵蓋了所有JDK自帶命令的功能,無需復雜配置即可使用,為開發者提供了極大的便利。
易於獲取和啟動:從JDK1.6版本開始,JVisualVM通常位於JDK安裝目錄的bin文件夾中。只需雙擊或通過命令行輸入jvisualvm即可啟動。
本地和遠程監控能力:JVisualVM不僅可以監控本地Java進程,如IDEA等IDE,還可以通過配置JVM參數來監控遠程伺服器上的Java進程。這包括CPU、內存、線程狀態和堆內存映像等詳細信息。
線程和內存分析:通過分析線程狀態和執行時間,以及內存使用情況,JVisualVM可以幫助開發者識別性能瓶頸和內存泄漏等問題。
導出內存映像和線程堆棧信息:JVisualVM支持導出內存映像和線程堆棧信息,這對於後續的性能分析和問題診斷至關重要。
Visual GC插件增強功能:通過安裝Visual GC插件,JVisualVM的性能分析功能可以得到進一步增強,提供更直觀的GC活動視圖。
堆mp文件分析:通過堆mp文件,JVisualVM可以深入檢查內存佔用和對象大小,這對於解決生產環境中的內存問題非常有幫助。
綜上所述,JVisualVM以其強大的功能和易用性,成為Java開發者在進行JVM性能監控和問題診斷時必不可少的工具。
C. Java開發者最有用的監控工具
Java 開發者最有用的監控工具如下:
Datadog
Datadog 是 SaaS 監測工具,針對 DevOps 團隊,從 app 或者其他各種工具獲取數據並提供數據可視化功能。它把從基礎設備和軟體採集的數據統一處理並存儲。允許創建儀表盤和搜索訪問提供的數據。
Ruxit
它由 Dynatrace 開發,Ruxit 是一個應用性能監控工具,它作用於 SaaS 模型。它通過 SaaS 提供不同的 APM 體驗,並工作在高擴展性環境中。
Takipi
Takipi 告 知生產環境下的代碼在什麼時候、因什麼原因而終止執行。它對所有錯誤進行檢測,同時會給出出現錯誤時代碼的位置和變數的狀態。Takipi 是以 Java 代理的身份運行的,與任何日誌文件無關,這樣就會減少小於 %3 的 CPU 和 IO 運行花費。