JMX監(jiān)控原理與使用詳解(手把手教你JMX)
JMX
JMX(Java Management Extensions),含義為Java管理擴(kuò)展的縮寫,是一個(gè)為應(yīng)用程序植入管理功能的框架,提供了一種簡(jiǎn)單的、標(biāo)準(zhǔn)的監(jiān)控和管理資源的方式。
JMX 應(yīng)用場(chǎng)景
JMX有以下典型的應(yīng)用場(chǎng)景:
- 監(jiān)控應(yīng)用程序的運(yùn)行狀態(tài)和相關(guān)統(tǒng)計(jì)信息;
- 修改應(yīng)用程序的配置(無需重啟);
- 狀態(tài)變化或出錯(cuò)時(shí)通知處理。
舉個(gè)例子,我們可以通過jconsole監(jiān)控應(yīng)用程序的堆內(nèi)存使用量、線程數(shù)、類數(shù),查看某些配置信息,甚至可以動(dòng)態(tài)地修改配置。
下圖是使用Jconsle通過JMX查看Java程序的運(yùn)行信息:
圖片
JMX最常見的場(chǎng)景是監(jiān)控Java程序的基本信息和運(yùn)行情況,任何Java程序都可以開啟JMX,然后使用JConsole或VisualVM進(jìn)行預(yù)覽。
JMX 的技術(shù)架構(gòu)
圖片
從圖中我們可以看到,JMX的結(jié)構(gòu)一共分為三層:
1、基礎(chǔ)層:主要是MBean,被管理的資源。
MBean分為如下四種:
圖片
2、適配層:主要是提供對(duì)資源的注冊(cè)和管理。
Agent層 用來管理相應(yīng)的資源,并且為遠(yuǎn)端用戶提供訪問的接口。
Agent層主要定義了各種服務(wù)以及通信模型,該層的核心是 MBeanServer,所有的MBean都要向它注冊(cè),才能被管理。
注冊(cè)在MBeanServer上的MBean并不直接和遠(yuǎn)程應(yīng)用程序進(jìn)行通信,他們通過 協(xié)議適配器(Adapter) 和 連接器(Connector) 進(jìn)行通信。
通常Agent由一個(gè)MBeanServer和多個(gè)系統(tǒng)服務(wù)組成。
3、接入層:提供遠(yuǎn)程訪問的入口。
怎么使用JMX
下面我們就簡(jiǎn)單的使用jmx來實(shí)現(xiàn)配置bean屬性的動(dòng)態(tài)修改,動(dòng)態(tài)修改的意思就是在不重啟服務(wù)器的情況下,實(shí)現(xiàn)配置屬性的變更。
第一步:提供管理信息
1) 首先定義一個(gè)MBean接口,接口的命名規(guī)范為以具體的實(shí)現(xiàn)類為前綴(這個(gè)規(guī)范很重要)
//接口要以MBean結(jié)尾
public interface HelloMBean {
String getName();
void setName(String name);
}
2)定義一個(gè)實(shí)現(xiàn)類,實(shí)現(xiàn)上面的接口
//實(shí)現(xiàn)類跟接口在同一個(gè)包中,且名字不包含MBean
public class Hello implements HelloMBean {
private String name;
@Override
public String getName() {
System.out.println("Hello.getName");
return name;
}
@Override
public void setName(String name) {
this.name = name;
System.out.println("Hello.setName");
}
}
第二步:使用jconsole連接
jconsole是jdk自帶工具,在配置了jdk環(huán)境之后,我們只需要在cmd命令行中輸入jconsole即可。
如下圖所示:
圖片
然后我們就可以在這里來進(jìn)行Name屬性的修改。
第三步:控制打印結(jié)果