一并思、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)圖:
從圖中我們可以看到苟弛,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)開啟
3.在這個(gè)界面上句柠,我們可以給程序中HelloMBean的屬性賦值浦译,也可以調(diào)用其中的方法:
四、通過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:
五叹俏、通過客戶端程序進(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被芳。