點贊再看,動力無限。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。