點贊再看,動力無限。Hello world : ) 微信搜「 程式猿阿朗 」。
本文 Github.com/niumoo/JavaNotes 和 程式猿阿朗部落格 已經收錄,有很多知識點和系列文章。
當前文章屬於Java 效能分析優化系列文章,點選可以檢視所有文章。
這篇文章是 Java 效能分析監控與優化系列的第一篇文章,原本是計劃系統的介紹 Java 效能分析方式和流行的監控工具,但是提筆之後意識到,只介紹分析方式和監控工具過於淺嘗輒止了。如果只會使用某個工具而不知道背後的實現原理,總覺得有種陌生感,我想你們也是一樣,所以多了這篇文章。
Java SE 監控管理功能
這篇文章介紹 Java Standard Edition(Java SE)平臺提供的監控和管理技術 - JMX(Java Management Extensions) 技術。
Java SE 平臺本身就提供了用於監控和管理服務的實用性功能模組,按功能來說主要分為下面四類:
- Java 監控和管理 API
- Java 虛擬機器檢測
- Java 管理擴充套件技術(JMX)
- Java 監控和管理的工具
這篇文章會介紹這四個部分的相關知識,旨在瞭解 Java SE 監控與管理的相關功能,對其中的相關概念有個理解。
Java 監控和管理 API
Java SE 中包含了用於監控和管理的(java.lang.management
)API,通過這些 API 可以實現應用程式的自我監控,此 API 主要提供了以下資訊的訪問:
- 類載入相關。
- JVM 相關,如執行時間、系統環境變數、使用者輸入引數。
- 執行緒相關,如執行緒狀態,執行緒的統計資訊、執行緒的堆疊等。
- 記憶體使用情況。
- GC 情況。
- 死鎖檢測。
- 作業系統資訊。
下圖是 Java 17 中的 java.management
模組。
JConsole 就是通過訪問這些管理 API 提供的資料,繪製了監控的介面版。
Java 虛擬機器監測
上面說到 Java SE 中已經內建了開箱即用的監控和管理功能,通過這些功能可以實現程式的自我監測,Java 預設已經實現了對 Java 虛擬機器相關資訊的監測,在 Java 監控和管理 API 部分也列舉了 API 可以監測的部分內容,那麼怎麼使用呢?
下面通過一個簡單的示例,演示如何通過監控管理 API 獲取系統資訊、編譯器資訊、記憶體資訊以及垃圾收集器資訊。
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("作業系統:%s,版本:%s,處理器:%d 個", osName, osVersion, processors));
CompilationMXBean compilationMXBean = ManagementFactory.getCompilationMXBean();
String compilationMXBeanName = compilationMXBean.getName();
System.out.println("編譯系統:" + compilationMXBeanName);
MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage();
long max = heapMemoryUsage.getMax();
long used = heapMemoryUsage.getUsed();
System.out.println(String.format("使用記憶體:%dMB/%dMB", used / 1024 / 1024, max / 1024 / 1024));
List<GarbageCollectorMXBean> gcMXBeans = ManagementFactory.getGarbageCollectorMXBeans();
String gcNames = gcMXBeans.stream()
.map(MemoryManagerMXBean::getName)
.collect(Collectors.joining(","));
System.out.println("垃圾收集器:" + gcNames);
}
}
執行時指定了記憶體為 100MB(-Xms100M -Xmx100M
),得到如下結果。
作業系統:Mac OS X,版本:11.6,處理器:12 個
編譯系統:HotSpot 64-Bit Tiered Compilers
使用記憶體:2MB/100MB
垃圾收集:G1 Young Generation,G1 Old Generation
:::tip 注意
細看程式碼可以發現其中很多類都是以 MXBean 結尾,這是什麼意思呢?
:::
Java 管理擴充套件技術(JMX)
在 Java 虛擬機器監測中的程式碼示例中,可以看到很多命名以 MXBean 結尾的類,這裡已經涉及到了 JMX(Java Management Extensions) 技術。
JMX 技術提供了一種簡單、標準的方式來管理資源,如作業系統、虛擬機器資訊、記憶體狀態、執行緒資訊等,這些統稱為被管理的資源。而且 JMX 是可以動態的,所以可以使用 JMX 技術來監測和管理各種資源。可以使用 JMX 技術來監測 Java 虛擬機器狀態,也可以使用 JMX 技術構建自己的需要管理的資源。
JMX 技術只有資源定義那麼簡單嗎?不是的。JMX 規範了 Java 中資源定義的方式、資源管理的方式、監控和管理的體系結構、具體實現的設計模式、監控和管理的相關 API 以及用於網路的遠端監控服務(RMI),這一系列功能統稱為 JMX 技術。是 Java SE 平臺的標準部分。
上面多次提到了管理資源,那麼如何定義一個資源呢?JMX 技術給出了資源定義的體系結構和設計模式,在 JMX 中,通過定義一個被稱為 MBean 或 MXBean 的 Java 物件來表示要管理指定的資源,資源定義的 Java 類名必須以 MBean 或 MXBean 結尾。
下圖是 Java 17 中的以 MXBean 結尾的資源定義類,通過命名可以看出每個類代表了什麼資源。
這篇文章主要是介紹 Java SE 中的監控與管理功能,讓大家對 Java 中的監控與管理背後的原理和概念有一個具體的認識,所以 MBean 和 MXBean 的具體設計實現方式不是這篇文章的重點,這裡不過多介紹,會放到下一篇獨立的 JMX 技術文章中介紹。
Java 監控和管理的工具
JMX 技術中提到 JMX 不僅提供了監控和管理的 API ,還提供了用於網路遠端管理的服務,可以使用 JMX 相關監控管理工具,通過網路遠端連線到正在執行 Java 虛擬機器,監控其執行狀態,Java 中整合的 jconsole
就是這樣一款工具。
本地隨意啟動一個可以持續執行的 Java 程式用作被監測物件,如果你已經配置好 Java 環境變數,可以直接通過 jconsole
啟動工具。
$ jconsole
啟動後的 jconsole
已經列出了本地正在執行的 Java 程式,選擇自己想要監測的進行進行監測。
連線成功後可以看到當前 Java 程式的資源佔用情況。
在 MBean 頁面中,可以看到各種已經被定義的資源的具體情況。
Jconsole 是一款強大的圖形介面 JMX 管理工具,不僅可以連線本地 Java 程式,還可以通過網路監控遠端的 Java 程式執行狀態,不過不是此篇文章重點,不在詳細描述。
參考:
- https://docs.oracle.com/en/java/javase/17/jmx/
- https://docs.oracle.com/en/java/javase/17/management/
當前文章屬於Java 效能分析優化系列文章,點選可以檢視所有文章。
文章持續更新,可以微信搜一搜「 程式猿阿朗 」或訪問「程式猿阿朗部落格 」第一時間閱讀。本文 Github.com/niumoo/JavaNotes 已經收錄,有很多知識點和系列文章,歡迎Star。