理解jmx

一并思、JMX的定義

Java 管理擴(kuò)展(Java Management Extension,JMX)是從jdk1.4開始的语稠,但從1.5時(shí)才加到j(luò)dk里面,并把API放到j(luò)ava.lang.management包里面弄砍。

如果一個(gè) Java 對(duì)象可以由一個(gè)遵循 JMX 規(guī)范的管理器應(yīng)用管理仙畦,那么這個(gè)Java 對(duì)象就可以稱為一個(gè)可由 JMX 管理的資源。

要使一個(gè) Java 對(duì)象可管理音婶,則必須創(chuàng)建相應(yīng)的 MBean 對(duì)象慨畸,并通過這些 MBean 對(duì)象管理相應(yīng)的 Java 對(duì)象。當(dāng)擁有 MBean 類后衣式,需要將其實(shí)例化并注冊(cè)到 MBeanServer 上寸士。

相信很多做Java開發(fā)的同學(xué)都使用過JDK自帶的 jconsole 或者 jvisualvm 監(jiān)控過JVM的運(yùn)行情況,但不知道有沒有留意過它們會(huì)有一個(gè)MBean的功能/標(biāo)簽碴卧,通過MBean可以看到在JVM中運(yùn)行的組件的一些屬性和操作弱卡。JMX(Java Management Extensions),監(jiān)控管理框架住册,通過使用JMX可以監(jiān)控和管理應(yīng)用程序婶博。JMX最常見的場(chǎng)景是監(jiān)控Java程序的基本信息和運(yùn)行情況,任何Java程序都可以開啟JMX荧飞,然后使用JConsole或Visual VM進(jìn)行預(yù)覽

在 Java 程序運(yùn)行過程中凡人,對(duì) JVM 和系統(tǒng)的監(jiān)測(cè)一直是開發(fā)人員在開發(fā)過程中所需要的,在 Java SE 5 之前叹阔,需要使用底層 JVM api 才能監(jiān)測(cè) Java 程序運(yùn)行過程中 JVM 和系統(tǒng)的一些情況挠轴,相關(guān)的開發(fā)效率比較低。為了解決這個(gè)問題耳幢,Sun 在 Java SE 5 種發(fā)布了 JMX 用來(lái)管理監(jiān)測(cè) Java 程序岸晦。JMX 提供大量輕量級(jí)的監(jiān)測(cè) JVM 和運(yùn)行中對(duì)象/線程的方式,從而提升了 Java 的管理監(jiān)測(cè)能力。

JMX(Java Management Extensions)是一個(gè)為應(yīng)用程序植入管理功能的框架委煤。JMX是一套標(biāo)準(zhǔn)的代理和服務(wù)堂油,實(shí)際上,用戶可以在任何Java應(yīng)用程序中使用這些代理和服務(wù)實(shí)現(xiàn)管理碧绞。JMX讓程序有被管理的功能府框,例如你開發(fā)一個(gè)WEB網(wǎng)站,它是在24小時(shí)不間斷運(yùn)行讥邻,那么你肯定會(huì)對(duì)網(wǎng)站進(jìn)行監(jiān)控迫靖,如每天的UV、PV是多少兴使;又或者在業(yè)務(wù)高峰的期間系宜,你想對(duì)接口進(jìn)行限流,就必須去修改接口并發(fā)的配置值发魄。

應(yīng)用場(chǎng)景:中間件軟件WebLogic的管理頁(yè)面就是基于JMX開發(fā)的盹牧,而JBoss則整個(gè)系統(tǒng)都基于JMX構(gòu)架。

對(duì)于一些參數(shù)的修改励幼,網(wǎng)上有一段描述還是比較形象的:

1汰寓、程序初哥一般是寫死在程序中,到要改變的時(shí)候就去修改代碼苹粟,然后重新編譯發(fā)布有滑。

2、程序熟手則配置在文件中(JAVA一般都是properties文件)嵌削,到要改變的時(shí)候只要修改配置文件毛好,但還是必須重啟系統(tǒng),以便讀取配置文件里最新的值苛秕。

3肌访、程序好手則會(huì)寫一段代碼,把配置值緩存起來(lái)艇劫,系統(tǒng)在獲取的時(shí)候场靴,先看看配置文件有沒有改動(dòng),如有改動(dòng)則重新從配置里讀取港准,否則從緩存里讀取旨剥。

4、程序高手則懂得物為我所用浅缸,用JMX把需要配置的屬性集中在一個(gè)類中轨帜,然后寫一個(gè)MBean,再進(jìn)行相關(guān)配置衩椒。另外JMX還提供了一個(gè)工具頁(yè)蚌父,以方便我們對(duì)參數(shù)值進(jìn)行修改哮兰。

二、JMX架構(gòu)圖:

image.png

從圖中我們可以看到苟弛,JMX的結(jié)構(gòu)一共分為三層:

1喝滞、基礎(chǔ)層:主要是MBean,Managed Beans 被管理的資源(MBean)代表了某種資源膏秫,MBean可以暴露一些接口右遭,用于對(duì)MBean所代表的資源進(jìn)行查看、修改等操作缤削。

MBean分為如下四種窘哈,我接下來(lái)主要介紹standard MBean

類型  描述
standard MBean  這種類型的MBean最簡(jiǎn)單,它能管理的資源(包括屬性亭敢,方法滚婉,時(shí)間)必須定義在接口中,然后MBean必須實(shí)現(xiàn)這個(gè)接口帅刀。它的命名也必須遵循一定的規(guī)范让腹,例如我們的MBean為Hello,則接口必須為HelloMBean扣溺。
dynamic MBean   必須實(shí)現(xiàn)javax.management.DynamicMBean接口骇窍,所有的屬性,方法都在運(yùn)行時(shí)定義
open MBean  此MBean的規(guī)范還不完善娇妓,正在改進(jìn)中
model MBean 與標(biāo)準(zhǔn)和動(dòng)態(tài)MBean相比,你可以不用寫MBean類活鹰,只需使用javax.management.modelmbean.RequiredModelMBean即可哈恰。RequiredModelMBean實(shí)現(xiàn)了ModelMBean接口,而ModelMBean擴(kuò)展了DynamicMBean接口志群,因此與DynamicMBean相似着绷,Model MBean的管理資源也是在運(yùn)行時(shí)定義的。與DynamicMBean不同的是锌云,DynamicMBean管理的資源一般定義在DynamicMBean中(運(yùn)行時(shí)才決定管理那些資源)荠医,而model MBean管理的資源并不在MBean中,而是在外部(通常是一個(gè)類)桑涎,只有在運(yùn)行時(shí)彬向,才通過set方法將其加入到model MBean中。后面的例子會(huì)有詳細(xì)介紹

2攻冷、適配層:JMX agents (JMX代理)管理著一個(gè)或多個(gè)MBean娃胆,并將MBean暴露給客戶端。JMX代理的核心組件是MBean Server等曼,用于接受客戶端的連接里烦,并對(duì)客戶端的請(qǐng)求做出響應(yīng)担猛。MBeanServer咨演,主要是提供對(duì)資源的注冊(cè)和管理。
3、接入層:提供遠(yuǎn)程訪問的入口该溯,Remoete Connectors 可以簡(jiǎn)單理解成客戶端,最貼近用戶瑟枫,用于接受用戶的請(qǐng)求祖乳,并將請(qǐng)求發(fā)送給JMX代理,然后將JMX代理的響應(yīng)返回給用戶触趴。

舉個(gè)例子氮发,假設(shè)公司現(xiàn)在有一大堆糧食(有很多種類)需要管理,并設(shè)計(jì)了一套方案用來(lái)管理糧食冗懦。他們是這樣設(shè)計(jì)的:用一類特殊的對(duì)象來(lái)管理這些糧食并且搭建了一個(gè)服務(wù)器爽冕,該服務(wù)器管理著這些糧食,而且還開發(fā)了一個(gè)對(duì)用戶友好的程序供用戶查看披蕉,購(gòu)買各種各樣的糧食颈畸。在這個(gè)例子中,用來(lái)表示糧食的對(duì)象就是MBean没讲,而服務(wù)器就是JMX Aagent眯娱,對(duì)用戶友好的程序其實(shí)就是客戶端。

接下來(lái)會(huì)用程序來(lái)介紹三種訪問JMX的方式:

三爬凑、JDK的小工具Jconsole訪問

1徙缴、 首先定義一個(gè)MBean接口,接口的命名規(guī)范為以具體的實(shí)現(xiàn)類為前綴(這個(gè)規(guī)范很重要)

package jmx;

public interface HelloMBean
{
     public String getName();

     public void setName(String name);

     public String getAge();

     public void setAge(String age);

     public void helloWorld();

     public void helloWorld(String str);

     public void getTelephone();
}

2嘁信、定義一個(gè)實(shí)現(xiàn)類于样,實(shí)現(xiàn)上面的接口:

1 package jmx;
 2 
 3 /*
 4  * 該類名稱必須與實(shí)現(xiàn)的接口的前綴保持一致(即MBean前面的名稱
 5  */
 6 public class Hello implements HelloMBean
 7 {
 8     private String name;
 9         
10     private String age;
11 
12     public void getTelephone()
13     {
14         System.out.println("get Telephone");
15     }
16 
17     public void helloWorld()
18     {
19         System.out.println("hello world");
20     }
21 
22     public void helloWorld(String str)
23     {
24         System.out.println("helloWorld:" + str);
25     }
26 
27     public String getName()
28     {
29         System.out.println("get name 123");
30         return name;
31     }
32 
33     public void setName(String name)
34     {
35         System.out.println("set name 123");
36         this.name = name;
37     }
38 
39     public String getAge()
40     {
41         System.out.println("get age 123");
42         return age;
43     }
44 
45     public void setAge(String age)
46     {
47         System.out.println("set age 123");
48         this.age = age;
49     }      
53 }

3、定義agent層:

package jmx;

import java.lang.management.ManagementFactory;

import javax.management.JMException;
import javax.management.MBeanServer;
import javax.management.ObjectName;

public class HelloAgent
{
    public static void main(String[] args) throws JMException, Exception
    {
         MBeanServer server = ManagementFactory.getPlatformMBeanServer();
         ObjectName helloName = new ObjectName("jmxBean:name=hello");
         //create mbean and register mbean
         server.registerMBean(new Hello(), helloName);
         Thread.sleep(60*60*1000);
    }
}

1潘靖、其中第13行是通過工廠類獲取MBeanServer穿剖,用來(lái)做MBean的容器 。
2卦溢、第14行中的ObjectName中的取名是有一定規(guī)范的糊余,格式為:“域名:name=MBean名稱”,其中域名和MBean的名稱可以任意取单寂。這樣定義后贬芥,就可以唯一標(biāo)識(shí)我們定義的這個(gè)MBean的實(shí)現(xiàn)類了。
3宣决、第16行是將Hello這個(gè)類注入到MBeanServer中誓军,注入需要?jiǎng)?chuàng)建一個(gè)ObjectName類

這樣,一個(gè)簡(jiǎn)單的JMX的DEMO已經(jīng)寫完了疲扎,現(xiàn)在我們通過JDK提供的Jconsole來(lái)進(jìn)行操作昵时。

用Jconsole連接過程中會(huì)報(bào)錯(cuò)捷雕,本地連接“提示安全連接失敗”,需要設(shè)置jvm啟動(dòng)參數(shù)

-Dcom.sun.management.jmxremote
-Djava.rmi.server.hostname=127.0.0.1
-Dcom.sun.management.jmxremote.port=8888
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

參數(shù)含義

-Dcom.sun.management.jmxremote  布爾  是否支持遠(yuǎn)程JMX訪問壹甥,默認(rèn)true
-Dcom.sun.management.jmxremote.port 數(shù)值  監(jiān)聽端口號(hào)救巷,方便遠(yuǎn)程訪問
-Dcom.sun.management.jmxremote.authenticate 布爾  是否需要開啟用戶認(rèn)證,默認(rèn)開啟
-Dcom.sun.management.jmxremote.ssl  布爾  是否對(duì)連接開啟SSL加密,默認(rèn)開啟
image.png

3.在這個(gè)界面上句柠,我們可以給程序中HelloMBean的屬性賦值浦译,也可以調(diào)用其中的方法:

image.png
image.png

四、通過JMX提供的工具頁(yè)訪問

這里溯职,我們復(fù)用上面的接口和實(shí)現(xiàn)類精盅,只需要改動(dòng)適配層,這里需要到導(dǎo)入外部jar包jdmk

package jmx;

import java.lang.management.ManagementFactory;

import javax.management.JMException;
import javax.management.MBeanServer;
import javax.management.ObjectName;

import com.sun.jdmk.comm.HtmlAdaptorServer;

public class HelloAgent
{
    public static void main(String[] args) throws JMException, Exception
    {
         MBeanServer server = ManagementFactory.getPlatformMBeanServer();
         ObjectName helloName = new ObjectName("jmxBean:name=hello");
         //create mbean and register mbean
         server.registerMBean(new Hello(), helloName);
         
         ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082");   
         HtmlAdaptorServer adapter = new HtmlAdaptorServer();   
         server.registerMBean(adapter, adapterName);  
         adapter.start();
    }
}

我們?cè)L問地址:http://localhost:8082谜酒,點(diǎn)擊name=hello:

image.png

五叹俏、通過客戶端程序進(jìn)行遠(yuǎn)程訪問

1、這里需要對(duì)agent進(jìn)行修改僻族,增加ip和porta綁定部分的邏輯

package jmxTest;

import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;

import javax.management.JMException;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;

public class HelloAgent
{
    public static void main(String[] args) throws JMException, NullPointerException
    {
        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
        ObjectName helloName = new ObjectName("jmxBean:name=hello");
        //create mbean and register mbean
        server.registerMBean(new Hello(), helloName);
        try
        {
            //這個(gè)步驟很重要粘驰,注冊(cè)一個(gè)端口,綁定url后用于客戶端通過rmi方式連接JMXConnectorServer
            LocateRegistry.createRegistry(9999);
            //URL路徑的結(jié)尾可以隨意指定述么,但如果需要用Jconsole來(lái)進(jìn)行連接蝌数,則必須使用jmxrmi
            JMXServiceURL url = new JMXServiceURL
                  ("service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi");
            JMXConnectorServer jcs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server);
            System.out.println("begin rmi start");
            jcs.start();
            System.out.println("rmi start");
        }
        catch (RemoteException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
          }}

客戶端Client程序,用于與agent進(jìn)行遠(yuǎn)程連接

    HashMap<String, Object> prop = new HashMap<String, Object>();
        prop.put(JMXConnector.CREDENTIALS, "jmx.Hello");
        JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi");
        JMXConnector conn = JMXConnectorFactory.connect(url, prop);
        MBeanServerConnection mbsc = conn.getMBeanServerConnection();
        ObjectName mbeanName = new ObjectName("com.jmx.demo9:name=jmx.Hello");
        HelloMBean hello = JMX.newMBeanProxy(mbsc, mbeanName, HelloMBean.class);
        hello.setName("World!");
        hello.sayHello();

Notification

MBean之間的通信是必不可少的度秘,Notification就起到了在MBean之間溝通橋梁的作用顶伞。JMX 的通知由四部分組成:

1、Notification這個(gè)相當(dāng)于一個(gè)信息包剑梳,封裝了需要傳遞的信息

2唆貌、Notification broadcaster這個(gè)相當(dāng)于一個(gè)廣播器,把消息廣播出阻荒。

3挠锥、Notification listener 這是一個(gè)監(jiān)聽器众羡,用于監(jiān)聽廣播出來(lái)的通知信息侨赡。

4、Notification filiter 這個(gè)一個(gè)過濾器粱侣,過濾掉不需要的通知羊壹。這個(gè)一般很少使用。

這里我們使用日常打招呼的場(chǎng)景:jack與我偶遇齐婴,jack說:hi油猫;我禮貌的回答:hello,jack柠偶。

package jmx;

/*
 * 該類名稱必須與實(shí)現(xiàn)的接口的前綴保持一致(即MBean前面的名稱
 */
public class Hello implements HelloMBean
{
    private String name;

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public void printHello()
    {
        System.out.println("Hello World, " + name);
    }

    public void printHello(String whoName)
    {
        System.out.println("Hello , " + whoName);
    }
}
package jmx;

/*
 * 接口名必須以MBean結(jié)尾
 */
public interface HelloMBean
{
    public String getName();   
    
    public void setName(String name);   
  
    public void printHello();   
  
    public void printHello(String whoName);
}
package jmx;

import javax.management.Notification;
import javax.management.NotificationBroadcasterSupport;

public class Jack extends NotificationBroadcasterSupport implements JackMBean
{
    private int seq = 0;
    public void hi()
    {
         //創(chuàng)建一個(gè)信息包
        Notification notify = 
            //通知名稱情妖;誰(shuí)發(fā)起的通知睬关;序列號(hào);發(fā)起通知時(shí)間毡证;發(fā)送的消息
            new Notification("jack.hi",this,++seq,System.currentTimeMillis(),"jack");
        sendNotification(notify);
    }

}
package jmx;

public interface JackMBean
{
    public void hi();
}
這里的類Jack不僅實(shí)現(xiàn)了MBean接口电爹,還繼承了NotificationBroadcasterSupport。jack在這里創(chuàng)建并發(fā)送了一個(gè)消息包料睛。
package jmx;

import javax.management.Notification;
import javax.management.NotificationListener;

public class HelloListener implements NotificationListener
{

    public void handleNotification(Notification notification, Object handback)
    {
        if(handback instanceof Hello)
        {
            Hello hello = (Hello)handback;
            hello.printHello(notification.getMessage());
        }
    }
    
}
package jmx;

import java.lang.management.ManagementFactory;

import javax.management.JMException;
import javax.management.MBeanServer;
import javax.management.ObjectName;

public class HelloAgent
{
    public static void main(String[] args) throws JMException, Exception
    {
        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
        ObjectName helloName = new ObjectName("yunge:name=Hello");    
        Hello hello=new Hello();          
        server.registerMBean(hello, helloName);  
        Jack jack = new Jack();
        server.registerMBean(jack, new ObjectName("jack:name=Jack"));
        jack.addNotificationListener(new HelloListener(), null, hello);
        Thread.sleep(500000);
    }
}

linux下利用JMX監(jiān)控Tomcat

利用JMX監(jiān)控Tomcat丐箩,就是相當(dāng)于部署在tomcat上的應(yīng)用作為服務(wù)端,也就是被管理資源的對(duì)象恤煞。然后通過程序或者jconsole遠(yuǎn)程連接到該應(yīng)用上來(lái)屎勘。遠(yuǎn)程連接需要服務(wù)器端提供ip和port。如果需要加密訪問的話居扒,還需要配置用戶名概漱、密碼等參數(shù)。

主要是在tomcat下的文件catalina.sh中進(jìn)行一些環(huán)境變量的配置配置:

-Dcom.sun.management.jmxremote=true                 相關(guān) JMX 代理偵聽開關(guān)

-Djava.rmi.server.hostname                                     服務(wù)器端的IP
-Dcom.sun.management.jmxremote.port=29094             相關(guān) JMX 代理偵聽請(qǐng)求的端口

-Dcom.sun.management.jmxremote.ssl=false              指定是否使用 SSL 通訊

-Dcom.sun.management.jmxremote.authenticate=false     指定是否需要密碼驗(yàn)證

這樣就可以通過客戶端或者jconsole對(duì)tomcat進(jìn)行監(jiān)控苔货。

遠(yuǎn)程連接

毫無(wú)疑問犀概,若想遠(yuǎn)程連接訪問,肯定需要mBeanServer注冊(cè)一個(gè)或多個(gè)端口夜惭,如rmi端口姻灶,http端口等。

2.1 rmi端口注冊(cè)及訪問

有兩種方法诈茧,一種直接在代碼里面指定rmi端口产喉,并綁定,如下敢会,此種方法需要使用客戶端連接代碼訪問曾沈,另一種代碼不用指定端口,之需把mbean注冊(cè)到platformMBeanServer 里面鸥昏,并在啟動(dòng)進(jìn)程時(shí)加jmx參數(shù)指定塞俱,用這種方法可以通過jconsole,jvisualvm遠(yuǎn)程訪問。

@Test  
    public void testJmxRmiRegist() throws Exception {  
        int rmiPort = 2222;  
        String jmxServerName = "com.dxz.study.TestJmxRmiRegist";  
  
        // jdkfolder/bin/rmiregistry.exe 9999  
        Registry registry = LocateRegistry.createRegistry(rmiPort);  
  
        MBeanServer mbs = MBeanServerFactory.createMBeanServer(jmxServerName);  
        System.out.println(mbs);  
        // mbs = MBeanServerFactory.createMBeanServer();  
        // 新建MBean ObjectName, 在MBeanServer里標(biāo)識(shí)注冊(cè)的MBean  
        ObjectName name = new ObjectName(jmxServerName + ":type=HelloWorld");  
        // HtmlAdaptorServer adapter = new HtmlAdaptorServer();  
  
        // 在MBeanServer里注冊(cè)MBean, 標(biāo)識(shí)為ObjectName(com.tenpay.jmx:type=Echo)  
        mbs.registerMBean(new HelloWorld(), name);  
  
        JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:" + rmiPort + "/" + jmxServerName);  
        System.out.println("JMXServiceURL: " + url.toString());  
        JMXConnectorServer jmxConnServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);  
        jmxConnServer.start();  
  
        Thread.sleep(1000 * 60 * 10);  
    }

上面程序是新建了個(gè)mbeanserver吏垮,并通過rmi綁定到2222端口上障涯,等待客戶端連接。

2.1.2 通過jmx參數(shù)啟動(dòng)進(jìn)程

JVMARGS="$JVMARGS -Dcom.sun.management.jmxremote.port=8888 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"

通過這種把進(jìn)程的jmx監(jiān)控綁定指定的端口膳汪,即可在遠(yuǎn)端通過jconsole進(jìn)行監(jiān)控唯蝶。

java進(jìn)程自帶的mbean

當(dāng)我們?cè)谟胘console、jvisualvm進(jìn)行監(jiān)控java進(jìn)程時(shí)遗嗽,通常都能看到cpu粘我、內(nèi)存、線程痹换、垃圾收集等使用情況征字,其實(shí)數(shù)據(jù)都是通過jmx從jvm提供的一些mbean里面取的都弹。主要如下:

ClassLoadingMXBean
ClassLoadMXBean 包括一些類的裝載信息,比如有多少類已經(jīng)裝載 / 卸載(unloaded)匙姜,虛擬機(jī)類裝載的 verbose 選項(xiàng)(即命令行中的 Java – verbose:class 選項(xiàng))是否打開缔杉,還可以幫助用戶打開 / 關(guān)閉該選項(xiàng)。

CompilationMXBean
CompilationMXBean 幫助用戶了解當(dāng)前的編譯器和編譯情況搁料,該 mxbean 提供的信息不多或详。

GarbageCollectorMXBean
相對(duì)于開放人員對(duì) GC 的關(guān)注程度來(lái)說,該 mxbean 提供的信息十分有限郭计,僅僅提供了 GC 的次數(shù)和 GC 花費(fèi)總時(shí)間的近似值霸琴。但是這個(gè)包中還提供了三個(gè)的內(nèi)存管理檢測(cè)類:MemoryManagerMXBean,MemoryMXBean 和 MemoryPoolMXBean昭伸。

MemoryManagerMXBean
這個(gè)類相對(duì)簡(jiǎn)單梧乘,提供了內(nèi)存管理類和內(nèi)存池(memory pool)的名字信息。

MemoryMXBean
這個(gè)類提供了整個(gè)虛擬機(jī)中內(nèi)存的使用情況庐杨,包括 Java 堆(heap)和非 Java 堆所占用的內(nèi)存选调,提供當(dāng)前等待 finalize 的對(duì)象數(shù)量,它甚至可以做 gc(實(shí)際上是調(diào)用 System.gc)灵份。

MemoryPoolMXBean
該信息提供了大量的信息仁堪。在 JVM 中,可能有幾個(gè)內(nèi)存池填渠,因此有對(duì)應(yīng)的內(nèi)存池信息弦聂,因此,在工廠類中氛什,getMemoryPoolMXBean() 得到是一個(gè) MemoryPoolMXBean 的 list莺葫。每一個(gè) MemoryPoolMXBean 都包含了該內(nèi)存池的詳細(xì)信息,如是否可用枪眉、當(dāng)前已使用內(nèi)存 / 最大使用內(nèi)存值捺檬、以及設(shè)置最大內(nèi)存值等等。

OperatingSystemMXBean
該類提供的是操作系統(tǒng)的簡(jiǎn)單信息贸铜,如構(gòu)架名稱堡纬、當(dāng)前 CPU 數(shù)、最近系統(tǒng)負(fù)載等萨脑。

RuntimeMXBean
運(yùn)行時(shí)信息包括當(dāng)前虛擬機(jī)的名稱隐轩、提供商饺饭、版本號(hào)渤早,以及 classpath、bootclasspath 和系統(tǒng)參數(shù)等等瘫俊。

ThreadMXBean
在 Java 這個(gè)多線程的系統(tǒng)中鹊杖,對(duì)線程的監(jiān)控是相當(dāng)重要的悴灵。ThreadMXBean 就是起到這個(gè)作用。ThreadMXBean 可以提供的信息包括各個(gè)線程的各種狀態(tài)骂蓖,CPU 占用情況积瞒,以及整個(gè)系統(tǒng)中的線程狀況。從 ThreadMXBean 可以得到某一個(gè)線程的 ThreadInfo 對(duì)象登下。這個(gè)對(duì)象中則包含了這個(gè)線程的所有信息茫孔。

要獲得這些信息,我們首先通過 java.lang.management.ManagementFactory這個(gè)工廠類來(lái)獲得一系列的 MXBean被芳。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末缰贝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子畔濒,更是在濱河造成了極大的恐慌剩晴,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侵状,死亡現(xiàn)場(chǎng)離奇詭異赞弥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)趣兄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門绽左,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人艇潭,你說我怎么就攤上這事妇菱。” “怎么了暴区?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵闯团,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我仙粱,道長(zhǎng)房交,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任伐割,我火速辦了婚禮候味,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘隔心。我一直安慰自己白群,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布硬霍。 她就那樣靜靜地躺著帜慢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上粱玲,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天躬柬,我揣著相機(jī)與錄音,去河邊找鬼抽减。 笑死允青,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的卵沉。 我是一名探鬼主播颠锉,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼史汗!你這毒婦竟也來(lái)了木柬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤淹办,失蹤者是張志新(化名)和其女友劉穎眉枕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怜森,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡速挑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了副硅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姥宝。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖恐疲,靈堂內(nèi)的尸體忽然破棺而出腊满,到底是詐尸還是另有隱情,我是刑警寧澤培己,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布碳蛋,位于F島的核電站,受9級(jí)特大地震影響省咨,放射性物質(zhì)發(fā)生泄漏肃弟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一零蓉、第九天 我趴在偏房一處隱蔽的房頂上張望笤受。 院中可真熱鬧,春花似錦敌蜂、人聲如沸箩兽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)汗贫。三九已至身坐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間芳绩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工撞反, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留妥色,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓遏片,卻偏偏與公主長(zhǎng)得像嘹害,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吮便,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345