Java 中的監控與管理原理概述

程式猿阿朗發表於2021-11-30

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

java.lang.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 中,通過定義一個被稱為 MBeanMXBean 的 Java 物件來表示要管理指定的資源,資源定義的 Java 類名必須以 MBeanMXBean 結尾。

下圖是 Java 17 中的以 MXBean 結尾的資源定義類,通過命名可以看出每個類代表了什麼資源。

Java 中的 MXbean

這篇文章主要是介紹 Java SE 中的監控與管理功能,讓大家對 Java 中的監控與管理背後的原理和概念有一個具體的認識,所以 MBean 和 MXBean 的具體設計實現方式不是這篇文章的重點,這裡不過多介紹,會放到下一篇獨立的 JMX 技術文章中介紹。

Java 監控和管理的工具

JMX 技術中提到 JMX 不僅提供了監控和管理的 API ,還提供了用於網路遠端管理的服務,可以使用 JMX 相關監控管理工具,通過網路遠端連線到正在執行 Java 虛擬機器,監控其執行狀態,Java 中整合的 jconsole 就是這樣一款工具。

本地隨意啟動一個可以持續執行的 Java 程式用作被監測物件,如果你已經配置好 Java 環境變數,可以直接通過 jconsole 啟動工具。

 $ jconsole

啟動後的 jconsole 已經列出了本地正在執行的 Java 程式,選擇自己想要監測的進行進行監測。

Jconsole 介面

連線成功後可以看到當前 Java 程式的資源佔用情況。

JConsole 監控

在 MBean 頁面中,可以看到各種已經被定義的資源的具體情況。

Jconsole MBean 情況

Jconsole 是一款強大的圖形介面 JMX 管理工具,不僅可以連線本地 Java 程式,還可以通過網路監控遠端的 Java 程式執行狀態,不過不是此篇文章重點,不在詳細描述。

參考:

當前文章屬於Java 效能分析優化系列文章,點選可以檢視所有文章。

文章持續更新,可以微信搜一搜「 程式猿阿朗 」或訪問「程式猿阿朗部落格 」第一時間閱讀。本文 Github.com/niumoo/JavaNotes 已經收錄,有很多知識點和系列文章,歡迎Star。

相關文章