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

Java SE 監控管理功能

這篇文章會介紹這四個部分的相關知識,旨在瞭解 Java SE 監控與管理的相關功能,對其中的相關概念有個理解。

Java 監控和管理 API

Java SE 中包含了用於監控和管理的(java.lang.management)API,通過這些 API 可以實現應用程序的自我監控,此 API 主要提供了以下信息的訪問:

下圖是 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 中的 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 程序運行狀態,不過不是此篇文章重點,不在詳細描述。

參考:

Hello world : ) 這篇文章就到這裏了,我是阿朗,點贊和在看,動力無限,求關注

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/l0zMw6TCWfXh1tPnxDN4Gg