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

























