<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Java 中的監(jiān)控與管理原理概述

          共 4210字,需瀏覽 9分鐘

           ·

          2021-12-01 13:40


          這篇文章是?Java 性能分析監(jiān)控與優(yōu)化系列的第一篇文章,原本是計(jì)劃系統(tǒng)的介紹 Java 性能分析方式和流行的監(jiān)控工具,但是提筆之后意識(shí)到,只介紹分析方式和監(jiān)控工具過于淺嘗輒止了。如果只會(huì)使用某個(gè)工具而不知道背后的實(shí)現(xiàn)原理,總覺得有種陌生感,我想你們也是一樣,所以多了這篇文章。

          文章目錄

          Java SE 監(jiān)控管理功能

          這篇文章介紹 Java Standard Edition(Java SE)平臺(tái)提供的監(jiān)控和管理技術(shù) -?JMX(Java Management Extensions) 技術(shù)。

          Java SE 平臺(tái)本身就提供了用于監(jiān)控和管理服務(wù)的實(shí)用性功能模塊,按功能來說主要分為下面四類:

          • Java 監(jiān)控和管理 API
          • Java 虛擬機(jī)檢測(cè)
          • Java 管理擴(kuò)展技術(shù)(JMX)
          • Java 監(jiān)控和管理的工具

          這篇文章會(huì)介紹這四個(gè)部分的相關(guān)知識(shí),旨在了解 Java SE 監(jiān)控與管理的相關(guān)功能,對(duì)其中的相關(guān)概念有個(gè)理解。

          Java 監(jiān)控和管理 API

          Java SE 中包含了用于監(jiān)控和管理的(java.lang.management)API,通過這些 API 可以實(shí)現(xiàn)應(yīng)用程序的自我監(jiān)控,此 API 主要提供了以下信息的訪問:

          • 類加載相關(guān)。
          • JVM 相關(guān),如運(yùn)行時(shí)間、系統(tǒng)環(huán)境變量、用戶輸入?yún)?shù)。
          • 線程相關(guān),如線程狀態(tài),線程的統(tǒng)計(jì)信息、線程的堆棧等。
          • 內(nèi)存使用情況。
          • GC 情況。
          • 死鎖檢測(cè)。
          • 操作系統(tǒng)信息。

          下圖是 Java 17 中的?java.management?模塊。

          java.lang.management

          JConsole 就是通過訪問這些管理 API 提供的數(shù)據(jù),繪制了監(jiān)控的界面版。

          Java 虛擬機(jī)監(jiān)測(cè)

          上面說到 Java SE 中已經(jīng)內(nèi)置了開箱即用的監(jiān)控和管理功能,通過這些功能可以實(shí)現(xiàn)程序的自我監(jiān)測(cè),Java 默認(rèn)已經(jīng)實(shí)現(xiàn)了對(duì) Java 虛擬機(jī)相關(guān)信息的監(jiān)測(cè),在 Java 監(jiān)控和管理 API 部分也列舉了 API 可以監(jiān)測(cè)的部分內(nèi)容,那么怎么使用呢?

          下面通過一個(gè)簡(jiǎn)單的示例,演示如何通過監(jiān)控管理 API 獲取系統(tǒng)信息、編譯器信息、內(nèi)存信息以及垃圾收集器信息。

          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("操作系統(tǒng):%s,版本:%s,處理器:%d 個(gè)",?osName,?osVersion,?processors));

          ????????CompilationMXBean?compilationMXBean?=?ManagementFactory.getCompilationMXBean();
          ????????String?compilationMXBeanName?=?compilationMXBean.getName();
          ????????System.out.println("編譯系統(tǒng):"?+?compilationMXBeanName);

          ????????MemoryMXBean?memoryMXBean?=?ManagementFactory.getMemoryMXBean();
          ????????MemoryUsage?heapMemoryUsage?=?memoryMXBean.getHeapMemoryUsage();
          ????????long?max?=?heapMemoryUsage.getMax();
          ????????long?used?=?heapMemoryUsage.getUsed();
          ????????System.out.println(String.format("使用內(nèi)存:%dMB/%dMB",?used?/?1024?/?1024,?max?/?1024?/?1024));

          ????????List?gcMXBeans?=?ManagementFactory.getGarbageCollectorMXBeans();
          ????????String?gcNames?=?gcMXBeans.stream()
          ????????????.map(MemoryManagerMXBean::getName)
          ????????????.collect(Collectors.joining(","));
          ????????System.out.println("垃圾收集器:"?+?gcNames);
          ????}
          }

          運(yùn)行時(shí)指定了內(nèi)存為 100MB(-Xms100M -Xmx100M),得到如下結(jié)果。

          操作系統(tǒng):Mac OS X,版本:11.6,處理器:12 個(gè)
          編譯系統(tǒng):HotSpot 64-Bit Tiered Compilers
          使用內(nèi)存:2MB/100MB
          垃圾收集:G1 Young Generation,G1 Old Generation

          :::tip 注意

          細(xì)看代碼可以發(fā)現(xiàn)其中很多類都是以?MXBean?結(jié)尾,這是什么意思呢?

          :::

          Java 管理擴(kuò)展技術(shù)(JMX)

          在 Java 虛擬機(jī)監(jiān)測(cè)中的代碼示例中,可以看到很多命名以?MXBean?結(jié)尾的類,這里已經(jīng)涉及到了?JMX(Java Management Extensions) 技術(shù)。

          JMX?技術(shù)提供了一種簡(jiǎn)單、標(biāo)準(zhǔn)的方式來管理資源,如操作系統(tǒng)、虛擬機(jī)信息、內(nèi)存狀態(tài)、線程信息等,這些統(tǒng)稱為被管理的資源。而且?JMX?是可以動(dòng)態(tài)的,所以可以使用?JMX?技術(shù)來監(jiān)測(cè)和管理各種資源??梢允褂?JMX 技術(shù)來監(jiān)測(cè) Java 虛擬機(jī)狀態(tài),也可以使用?JMX?技術(shù)構(gòu)建自己的需要管理的資源。

          JMX 技術(shù)只有資源定義那么簡(jiǎn)單嗎?不是的。JMX 規(guī)范了 Java 中資源定義的方式、資源管理的方式、監(jiān)控和管理的體系結(jié)構(gòu)、具體實(shí)現(xiàn)的設(shè)計(jì)模式、監(jiān)控和管理的相關(guān) API 以及用于網(wǎng)絡(luò)的遠(yuǎn)程監(jiān)控服務(wù)(RMI),這一系列功能統(tǒng)稱為 JMX 技術(shù)。是 Java SE 平臺(tái)的標(biāo)準(zhǔn)部分。

          上面多次提到了管理資源,那么如何定義一個(gè)資源呢?JMX 技術(shù)給出了資源定義的體系結(jié)構(gòu)和設(shè)計(jì)模式,在?JMX?中,通過定義一個(gè)被稱為?MBean?或?MXBean?的 Java 對(duì)象來表示要管理指定的資源,資源定義的 Java 類名必須以?MBean?或?MXBean?結(jié)尾。

          下圖是 Java 17 中的以 MXBean 結(jié)尾的資源定義類,通過命名可以看出每個(gè)類代表了什么資源。

          Java 中的 MXbean

          這篇文章主要是介紹 Java SE 中的監(jiān)控與管理功能,讓大家對(duì) Java 中的監(jiān)控與管理背后的原理和概念有一個(gè)具體的認(rèn)識(shí),所以 MBean 和 MXBean 的具體設(shè)計(jì)實(shí)現(xiàn)方式不是這篇文章的重點(diǎn),這里不過多介紹,會(huì)放到下一篇獨(dú)立的 JMX 技術(shù)文章中介紹。

          Java 監(jiān)控和管理的工具

          JMX 技術(shù)中提到 JMX 不僅提供了監(jiān)控和管理的 API ,還提供了用于網(wǎng)絡(luò)遠(yuǎn)程管理的服務(wù),可以使用 JMX 相關(guān)監(jiān)控管理工具,通過網(wǎng)絡(luò)遠(yuǎn)程連接到正在運(yùn)行 Java 虛擬機(jī),監(jiān)控其運(yùn)行狀態(tài),Java 中集成的?jconsole?就是這樣一款工具。

          本地隨意啟動(dòng)一個(gè)可以持續(xù)運(yùn)行的 Java 程序用作被監(jiān)測(cè)對(duì)象,如果你已經(jīng)配置好 Java 環(huán)境變量,可以直接通過?jconsole?啟動(dòng)工具。

          ?$?jconsole

          啟動(dòng)后的?jconsole?已經(jīng)列出了本地正在運(yùn)行的 Java 程序,選擇自己想要監(jiān)測(cè)的進(jìn)行進(jìn)行監(jiān)測(cè)。

          Jconsole 界面

          連接成功后可以看到當(dāng)前 Java 進(jìn)程的資源占用情況。

          JConsole 監(jiān)控

          在 MBean 頁(yè)面中,可以看到各種已經(jīng)被定義的資源的具體情況。

          Jconsole MBean 情況

          Jconsole 是一款強(qiáng)大的圖形界面 JMX 管理工具,不僅可以連接本地 Java 程序,還可以通過網(wǎng)絡(luò)監(jiān)控遠(yuǎn)程的 Java 程序運(yùn)行狀態(tài),不過不是此篇文章重點(diǎn),不在詳細(xì)描述。

          參考:

          • https://docs.oracle.com/en/java/javase/17/jmx/
          • https://docs.oracle.com/en/java/javase/17/management/


          ---- END ----

          Hello world : )?這篇文章就到這里了,我是阿朗,點(diǎn)贊和在看,動(dòng)力無限,求關(guān)注。


          瀏覽 72
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91偷拍网址 | 欧美奇米影视1873 | 操逼视频在线观看视频 | 日本在线视频二区 | 精品国产天线2024 |