JMX

簡介

全稱Java Management Extensions,從Java5.0開始引入到標準Java技術平臺中。JMX提供了一個標準的方法去管理資源,因為JMX是一種動態技術,你可以在被管理資源創建、實例化和實現的時候監控和管理他們。你也可以使用JMX技術去監聽和管理Java虛擬機。

Why JMX

  • JMX技術使Java應用程序無需在管理方面投入大量精力

JMX幾乎可以在任何支持Java的設備上運行,而且只需要嵌入一個管理對象服務器(MBean Server),使它的一些功能作為一個或幾個被管理的bean(MBean)在目標服務器上注冊。然后就可以從管理基礎設施中受益。

  • JMX技術提供了一個標準的方法去管理Java應用、系統和網絡

標準Java平臺都支持JMX架構,因此只要符合JMX規范都可以通過JMX管理。

  • JMX讓為Java應用提供了可伸縮、動態、分布式的管理架構

使Java應用可以遠程管理。

JMX架構

JMX架構
JMX架構

基本術語

  • Instrumentation

要管理的資源。使用Java Bean描述要管理的資源。這些Java Bean叫MBean(Management Bean)。

  • MBean Agent

代理層。主要定義了各種服務以及通信模型,和需要被管理的資源在同一機器上,核心模塊是MBean Server,所有的MBean都要向它注冊,才能被管理。注冊在MBeanServer上的MBean并不直接和遠程應用程序進行通信,他們通過協議適配器(Adapter)和連接器(Connector)進行通信。

  • Distributed Layer

也叫Remote Management Layer. 即遠程管理層。MBean Server依賴于該層的協議適配器(Adaptor)和連接器(Connector),讓JMX Agent可以被該JVM外面的管理系統遠程訪問。支持多種協議:SNMP,HTML,RMI.

MBean分類

  • Standard MBean
  • MXBean
  • Dynamic MBean
  • Open MBean
  • Module MBean

MBean在JDK中的應用

java.lang.management
平臺資源 對應的 MXBean 可使用的數量
緩沖池 BufferPoolMXBean 1個或多個
類裝入系統 ClassLoadingMXBean 1個
編譯系統 CompilationMXBean 1個
VM HotSpotDiagnosticMXBean 垃圾收集系統 GarbageCollectorMXBean 至少 1
內存管理器 MemoryManagerMXBean 1個或多個
內存 MemoryMXBean 1個
內存資源 MemoryPoolMXBean 1個
操作系統 OperatingSystemMXBean 1個
logging PlatformLoggingMXBean 1個
運行時系統 RuntimeMXBean 1個
系統資源壓力 SystemResourcePressureMXBean
線程 ThreadMXBean 1個

JDK中提供的這些MBean可以通過ManagementFactory獲取實例。

MBean規范

  • A set of readable or writable attributes, or both.
  • A set of invokable operations.
  • A self-description.
  • 管理接口貫穿于MBean的整個生命周期,并且是不變的。Mbean在某些預先定義的事件發生時可以發出通知(Notifications)。

Standard MBean

  • 標準MBean,需要滿足規范:

    • 定義管理接口SomethingMBean,并且有一個叫Something的實現類。標準MBean是這二者的組合,而且這兩個必須在一個包下。
  • 例子:

package com.example; 
public interface HelloMBean { 
 
    public void sayHello(); 
    public int add(int x, int y); 
    
    public String getName(); 
     
    public int getCacheSize(); 
    public void setCacheSize(int size); 
} 
package com.example; 
public class Hello implements HelloMBean { 
    public void sayHello() { 
        System.out.println("hello, world"); 
    } 
     
    public int add(int x, int y) { 
        return x + y; 
    } 
     
    public String getName() { 
        return this.name; 
    }  
     
    public int getCacheSize() { 
        return this.cacheSize; 
    } 
     
    public synchronized void setCacheSize(int size) {
        this.cacheSize = size; 
        System.out.println("Cache size now " + this.cacheSize); 
    } 

    private final String name = "Reginald"; 
    private int cacheSize = DEFAULT_CACHE_SIZE; 
    private static final int 
        DEFAULT_CACHE_SIZE = 200; 
}

MXBean

  • 與標準MBean類似,MXBean接口進行自述,以及一個實現類。
  • 不同于標準MBean,實現類可以叫任意名字。

Dynamic MBean

  • 動態MBean即編碼方式實現的MBean。

  • 不再通過定義接口來進行自述,而是通過實現DynamicMBean,定義metadata來進行描述。

    • DynamicMBean:

public interface DynamicMBean {

public Object getAttribute(String attribute) throws AttributeNotFoundException,
    MBeanException, ReflectionException;

public void setAttribute(Attribute attribute) throws AttributeNotFoundException,
    InvalidAttributeValueException, MBeanException, ReflectionException ;

public AttributeList getAttributes(String[] attributes);

public AttributeList setAttributes(AttributeList attributes);

public Object invoke(String actionName, Object params[], String signature[])
    throws MBeanException, ReflectionException ;

public MBeanInfo getMBeanInfo();

}

  * MBeanInfo描述管理接口
  * Attribute的getter和setter提供通用屬性設置,定義對外暴露的屬性
  * invoke提供通用操作,定義對外暴露的操作
* 注意:
    * Dynamic的意思是管理接口在運行時才會真正的顯現出來,不用通過事先靜態的接口定義。而不是指可以動態的調整管理接口。
    * MBean的描述應該是不會改變的,所以一般要在動態MBean的構造函數里來構建MBeanInfo。

## Module MBean
* Module MBean是動態MBean的一種實現,所以它的接口、屬性、操作也是通過編程方式來定義。
* JMX規范規定該類必須實現為javax.management.modelmbean.RequiredModelMBean,管理者要做的就是實例化該類,并配置該構件的默認行為并注冊到JMX代理中,即可實現對資源的管理。RequiredModelMBean是一個沒有任何管理接口的動態MBean,但是它可以把MBeanInfo跟一個目標對象組合起來。
* 目標對象是具體實現管理行為的類。通過ModelMBean接口的setManagedResource()可以將ModelMBean和目標對象進行關聯。

  ```java
public void setManagedResource(Object managedResource, String managedResourceType) ;
  • managedResourceType的值可以為ObjectReference, Handle, IOR, EJBHandle或RMIReference,但當前只支持ObjectReference.
RequiredModelMBean.png
  • Module MBean具有以下新的特點:
    • 持久性。定義了持久機制,可以利用Java的序列化或JDBC來存儲模型MBean的狀態。
    • 通知和日志功能。能記錄每一個發出的通知,并能自動發出屬性變化通知。
    • 屬性值緩存。具有緩存屬性值的能力。
  • 使用Apache commons-modeler 簡化Module MBean的開發

Open MBean

  • 也是一種動態MBean,規范還在完善中

Notifications

  • MBean提供了一套通知機制,其實就是觀察者模式
  • 繼承javax.management.NotificationBroadcasterSupport就可以發出通知
  • 實現javax.management.NotificationListener可以接收通知

Agent

  • Agent作為中間代理層,管理著MBeans并且對外暴露管理接口,核心模塊MBean Server
  • 通過工廠類:java.lang.management.ManagementFactory可以創建MBean Server,然后在server上注冊MBean。
  • 如果是只有本地使用,注冊完后就可以通過JConsole連接管理了。
  • 如果需要遠程管理,則需要配置協議適配器提供遠程管理能力。

Remote Management

遠程接口的暴露

  • 通過com.sun.jdmk.comm.HtmlAdaptorServer暴露HTML遠程管理接口
  • 通過javax.management.remote.JMXConnectorServer暴露RMI遠程管理接口
ObjectName adapterName = new ObjectName("MyMBean:name=htmladapter,port=8082");
HtmlAdaptorServer adapter = new HtmlAdaptorServer();
server.registerMBean(adapter, adapterName);
adapter.start();
LocateRegistry.createRegistry(8888);
// 必須service:jmx:開頭
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:8888/server");
JMXConnectorServer jcs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server);
jcs.start();

遠程客戶端

  • HTML方式的遠程客戶端就是瀏覽器
  • RMI方式可以使管理客戶端,如JConsole,也可以是自己編寫的Client

項目中的應用

Spring JMX

http://blog.csdn.net/yaerfeng/article/details/28232435

log4j JMX

http://logging.apache.org/log4j/2.x/manual/jmx.html

Tomcat JMX

http://tomcat.apache.org/tomcat-6.0-doc/monitoring.html

參考

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容