Java 中的監(jiān)控與管理原理概述
這篇文章是?Java 性能分析監(jiān)控與優(yōu)化系列的第一篇文章,原本是計(jì)劃系統(tǒng)的介紹 Java 性能分析方式和流行的監(jiān)控工具,但是提筆之后意識(shí)到,只介紹分析方式和監(jiān)控工具過于淺嘗輒止了。如果只會(huì)使用某個(gè)工具而不知道背后的實(shí)現(xiàn)原理,總覺得有種陌生感,我想你們也是一樣,所以多了這篇文章。

Java SE 監(jiān)控管理功能
這篇文章介紹 Java Standard Edition(Java SE)平臺(tái)提供的監(jiān)控和管理技術(shù) -?JMX(Java Management Extensions) 技術(shù)。
Java SE 平臺(tái)本身就提供了用于監(jiān)控和管理服務(wù)的實(shí)用性功能模塊,按功能來說主要分為下面四類:
Java 監(jiān)控和管理 API Java 虛擬機(jī)檢測(cè) Java 管理擴(kuò)展技術(shù)(JMX) Java 監(jiān)控和管理的工具
這篇文章會(huì)介紹這四個(gè)部分的相關(guān)知識(shí),旨在了解 Java SE 監(jiān)控與管理的相關(guān)功能,對(duì)其中的相關(guān)概念有個(gè)理解。
Java 監(jiān)控和管理 API
Java SE 中包含了用于監(jiān)控和管理的(java.lang.management)API,通過這些 API 可以實(shí)現(xiàn)應(yīng)用程序的自我監(jiān)控,此 API 主要提供了以下信息的訪問:
類加載相關(guān)。 JVM 相關(guān),如運(yùn)行時(shí)間、系統(tǒng)環(huán)境變量、用戶輸入?yún)?shù)。 線程相關(guān),如線程狀態(tài),線程的統(tǒng)計(jì)信息、線程的堆棧等。 內(nèi)存使用情況。 GC 情況。 死鎖檢測(cè)。 操作系統(tǒng)信息。
下圖是 Java 17 中的?java.management?模塊。

JConsole 就是通過訪問這些管理 API 提供的數(shù)據(jù),繪制了監(jiān)控的界面版。
Java 虛擬機(jī)監(jiān)測(cè)
上面說到 Java SE 中已經(jīng)內(nèi)置了開箱即用的監(jiān)控和管理功能,通過這些功能可以實(shí)現(xiàn)程序的自我監(jiān)測(cè),Java 默認(rèn)已經(jīng)實(shí)現(xiàn)了對(duì) Java 虛擬機(jī)相關(guān)信息的監(jiān)測(cè),在 Java 監(jiān)控和管理 API 部分也列舉了 API 可以監(jiān)測(cè)的部分內(nèi)容,那么怎么使用呢?
下面通過一個(gè)簡(jiǎn)單的示例,演示如何通過監(jiān)控管理 API 獲取系統(tǒng)信息、編譯器信息、內(nèi)存信息以及垃圾收集器信息。
package?com.wdbyte;
import?java.lang.management.CompilationMXBean;
import?java.lang.management.GarbageCollectorMXBean;
import?java.lang.management.ManagementFactory;
import?java.lang.management.MemoryMXBean;
import?java.lang.management.MemoryManagerMXBean;
import?java.lang.management.MemoryUsage;
import?java.lang.management.OperatingSystemMXBean;
import?java.util.List;
import?java.util.stream.Collectors;
public?class?JavaManagement?{
????public?static?void?main(String[]?args)?{
????????OperatingSystemMXBean?operatingSystemMXBean?=?ManagementFactory.getOperatingSystemMXBean();
????????String?osName?=?operatingSystemMXBean.getName();
????????String?osVersion?=?operatingSystemMXBean.getVersion();
????????int?processors?=?operatingSystemMXBean.getAvailableProcessors();
????????System.out.println(String.format("操作系統(tǒng):%s,版本:%s,處理器:%d 個(gè)",?osName,?osVersion,?processors));
????????CompilationMXBean?compilationMXBean?=?ManagementFactory.getCompilationMXBean();
????????String?compilationMXBeanName?=?compilationMXBean.getName();
????????System.out.println("編譯系統(tǒng):"?+?compilationMXBeanName);
????????MemoryMXBean?memoryMXBean?=?ManagementFactory.getMemoryMXBean();
????????MemoryUsage?heapMemoryUsage?=?memoryMXBean.getHeapMemoryUsage();
????????long?max?=?heapMemoryUsage.getMax();
????????long?used?=?heapMemoryUsage.getUsed();
????????System.out.println(String.format("使用內(nèi)存:%dMB/%dMB",?used?/?1024?/?1024,?max?/?1024?/?1024));
????????List?gcMXBeans?=?ManagementFactory.getGarbageCollectorMXBeans();
????????String?gcNames?=?gcMXBeans.stream()
????????????.map(MemoryManagerMXBean::getName)
????????????.collect(Collectors.joining(","));
????????System.out.println("垃圾收集器:"?+?gcNames);
????}
}
運(yùn)行時(shí)指定了內(nèi)存為 100MB(-Xms100M -Xmx100M),得到如下結(jié)果。
操作系統(tǒng):Mac OS X,版本:11.6,處理器:12 個(gè)
編譯系統(tǒng):HotSpot 64-Bit Tiered Compilers
使用內(nèi)存:2MB/100MB
垃圾收集:G1 Young Generation,G1 Old Generation
:::tip 注意
細(xì)看代碼可以發(fā)現(xiàn)其中很多類都是以?MXBean?結(jié)尾,這是什么意思呢?
:::
Java 管理擴(kuò)展技術(shù)(JMX)
在 Java 虛擬機(jī)監(jiān)測(cè)中的代碼示例中,可以看到很多命名以?MXBean?結(jié)尾的類,這里已經(jīng)涉及到了?JMX(Java Management Extensions) 技術(shù)。
JMX?技術(shù)提供了一種簡(jiǎn)單、標(biāo)準(zhǔn)的方式來管理資源,如操作系統(tǒng)、虛擬機(jī)信息、內(nèi)存狀態(tài)、線程信息等,這些統(tǒng)稱為被管理的資源。而且?JMX?是可以動(dòng)態(tài)的,所以可以使用?JMX?技術(shù)來監(jiān)測(cè)和管理各種資源??梢允褂?JMX 技術(shù)來監(jiān)測(cè) Java 虛擬機(jī)狀態(tài),也可以使用?JMX?技術(shù)構(gòu)建自己的需要管理的資源。
JMX 技術(shù)只有資源定義那么簡(jiǎn)單嗎?不是的。JMX 規(guī)范了 Java 中資源定義的方式、資源管理的方式、監(jiān)控和管理的體系結(jié)構(gòu)、具體實(shí)現(xiàn)的設(shè)計(jì)模式、監(jiān)控和管理的相關(guān) API 以及用于網(wǎng)絡(luò)的遠(yuǎn)程監(jiān)控服務(wù)(RMI),這一系列功能統(tǒng)稱為 JMX 技術(shù)。是 Java SE 平臺(tái)的標(biāo)準(zhǔn)部分。
上面多次提到了管理資源,那么如何定義一個(gè)資源呢?JMX 技術(shù)給出了資源定義的體系結(jié)構(gòu)和設(shè)計(jì)模式,在?JMX?中,通過定義一個(gè)被稱為?MBean?或?MXBean?的 Java 對(duì)象來表示要管理指定的資源,資源定義的 Java 類名必須以?MBean?或?MXBean?結(jié)尾。
下圖是 Java 17 中的以 MXBean 結(jié)尾的資源定義類,通過命名可以看出每個(gè)類代表了什么資源。

這篇文章主要是介紹 Java SE 中的監(jiān)控與管理功能,讓大家對(duì) Java 中的監(jiān)控與管理背后的原理和概念有一個(gè)具體的認(rèn)識(shí),所以 MBean 和 MXBean 的具體設(shè)計(jì)實(shí)現(xiàn)方式不是這篇文章的重點(diǎn),這里不過多介紹,會(huì)放到下一篇獨(dú)立的 JMX 技術(shù)文章中介紹。
Java 監(jiān)控和管理的工具
JMX 技術(shù)中提到 JMX 不僅提供了監(jiān)控和管理的 API ,還提供了用于網(wǎng)絡(luò)遠(yuǎn)程管理的服務(wù),可以使用 JMX 相關(guān)監(jiān)控管理工具,通過網(wǎng)絡(luò)遠(yuǎn)程連接到正在運(yùn)行 Java 虛擬機(jī),監(jiān)控其運(yùn)行狀態(tài),Java 中集成的?jconsole?就是這樣一款工具。
本地隨意啟動(dòng)一個(gè)可以持續(xù)運(yùn)行的 Java 程序用作被監(jiān)測(cè)對(duì)象,如果你已經(jīng)配置好 Java 環(huán)境變量,可以直接通過?jconsole?啟動(dòng)工具。
?$?jconsole
啟動(dòng)后的?jconsole?已經(jīng)列出了本地正在運(yùn)行的 Java 程序,選擇自己想要監(jiān)測(cè)的進(jìn)行進(jìn)行監(jiān)測(cè)。

連接成功后可以看到當(dāng)前 Java 進(jìn)程的資源占用情況。

在 MBean 頁(yè)面中,可以看到各種已經(jīng)被定義的資源的具體情況。

Jconsole 是一款強(qiáng)大的圖形界面 JMX 管理工具,不僅可以連接本地 Java 程序,還可以通過網(wǎng)絡(luò)監(jiān)控遠(yuǎn)程的 Java 程序運(yùn)行狀態(tài),不過不是此篇文章重點(diǎn),不在詳細(xì)描述。
參考:
https://docs.oracle.com/en/java/javase/17/jmx/ https://docs.oracle.com/en/java/javase/17/management/
Hello world : )?這篇文章就到這里了,我是阿朗,點(diǎn)贊和在看,動(dòng)力無限,求關(guān)注。

