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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM