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

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容