`
agapple
  • 浏览: 1584322 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

jmx的简单学习

    博客分类:
  • java
阅读更多

背景

前段时间在看btrace源码和jdk一些源码的时候,经常会看到一些jmx的相关内容。以前对jmx基本是一片空白区,花了点时间学习记录下。

 

过程

jmx总体架构图: 

说明: 
1.  Agent : javax.management.MBeanServer实现了Agent的功能,以标准的方式给出了管理系统访问 JMX 框架的接口
2. SubAgent: javax.management.MBeans实现了SubAgent的功能,以标准的方式给出了 JMX 框架访问资源的接口

MBean是Management Bean的缩写,负责将可管理资源和服务封装成类似Java Bean的形式。通过MBean的特性可以访问可管理资源的各类信息。MBean对资源的封装体现在以下几个方面:
* 属性名称及读写类型。
* 对资源的操作。
* 指定类型的通知。

从MBean的实现上来看,MBean分为两种类型:
  • 标准(Standard)MBean
  • 动态(Dynamic) MBean , 又进一步可分为Open MBean和Model MBean
Opean Mbean:与其它动态 MBean 的唯一区别在于,前者对其公开接口的参数和返回值有所限制。只能是基本类型或者 javax.management.openmbean 包内的 ArrayType、CompositeType、TarbularType 等类型。考虑到管理系统的分布,很可能远端管理系统甚至 MBServer 层都不具有 MBean 接口中特殊的类。

Model Mbean: 普通的动态 Bean 通常缺乏一些管理系统所需要的支持,JMX 提供商都会提供不同的 ModelBean 实现。其中有一个接口是 Java 规范中规定所有厂商必须实现的:javax.management.modelmbean.RequiredModelBean。通过配置 Descriptor 信息,我们可以定制这个 Model Bean, 指定哪些 MBean 状态需要记入日志、如何记录以及是否缓存某些属性、缓存多久等等。

Object Name介绍
ObjectName:是MBean的唯一标识,它在MBean向MBean服务器中注册时指定。管理应用可以通过这个标识来寻址MBean。Object Name体现了MBean服务器关于MBean的命名机制,这一机制是管理应用和MBean之间实现松耦合的关键。
Object Name的语法如下:
[domainName]:property=value[,property=value]*
可以看到,Object Name由两部分组成:域名和一组关键属性,具体说明如下。
(1)   域名(Domain Name)
关于域名的命名和Java包的约定一致,即“反向的DNS名 + 组织自定义的字串”。比如由Sun公司开发的MBean,其DNS名是sun.com,则其域名格式是com.sun.MyDomain。
(2)   关键属性(Key Properties)

关键属性是一些Key-value对,通过它们可以为MBean在指定的域中添加包括名字、类型和说明等属性,但这些属性可以不是MBean的实际属性。
例子: MyDomain:description=Printer,type=laser

资料: 

标准MBean例子: 

1.  定义MBean接口

public interface StandardServerMonitorMBean {
  public long getUpTime();
  public void start();
}

 说明: 

  • MBean的类命名和方法命名上存在一些约定
    类命名:需要监控的类名基础上加上"MBean",做为接口名字。对应的监控类必须实现该接口,通过该接口可以表述需要被jmx管理的attribute , operation信息等。
    方法名: get/set/is打头的代表的是一个attribute, 其他的一些方法定义做为可被操作的operation。
  • 方法名,注意是去掉get/set/is后的name ,  注意第一个字母大写。 这里就是UpTime
2.  实现具体的监控类

 

public class StandardServerMonitor implements StandardServerMonitorMBean {

    public long startTime = 0;

    public long getUpTime() {
        return System.currentTimeMillis() - startTime;
    }

    @Override
    public void start() {
        startTime = System.currentTimeMillis();
    }

}

 

说明:

  • 必须实现 类名+MBean 的一个接口

3.  调用测试

 

StandardServerMonitor serverMonitor = new StandardServerMonitor();
        // 注册mbean
        MBeanServer mBeanServer = MBeanServerFactory.createMBeanServer();
        ObjectName objectName = new ObjectName("objectName: id=serverMonitor");
        mBeanServer.registerMBean(serverMonitor, objectName);
        // mbean调用
        mBeanServer.invoke(objectName, "start", null, null);
        Thread.sleep(1000);
        Long upTime = (Long) mBeanServer.getAttribute(objectName, "UpTime");
        System.out.println("uptime : " + upTime);

输出结果:

 

uptime : 1000

 

DynamicMBean例子:

1.  实现Dynamic接口

 

public class DynamicServerMonitor implements DynamicMBean {

    private MBeanInfo             mBeanInfo;
    private StandardServerMonitor monitor;

    public DynamicServerMonitor(StandardServerMonitor monitor){
        this.monitor = monitor;
    }

    @Override
    public Object getAttribute(String attribute) throws AttributeNotFoundException, MBeanException, ReflectionException {
        if (attribute.equals("UpTime")) {
            return monitor.getUpTime();
        }
        return null;
    }

    @Override
    public AttributeList getAttributes(String[] attributes) {
        AttributeList result = new AttributeList();
        for (String attr : attributes) {
            if (attr.equals("UpTime")) {
                result.add(monitor.getUpTime());
            }
        }
        return result;
    }

    @Override
    public MBeanInfo getMBeanInfo() {
        if (mBeanInfo == null) {
            try {
                Class cls = StandardServerMonitor.class;
                // 用反射获得 "upTime" 属性的读方法
                Method readMethod = cls.getMethod("getUpTime", new Class[0]);
                // 用反射获得构造方法
                Constructor constructor = cls.getConstructor();
                // 关于 "upTime" 属性的元信息:名称为 UpTime,只读属性(没有写方法)。
                MBeanAttributeInfo upTimeMBeanAttributeInfo = new MBeanAttributeInfo(
                                                                                     "UpTime",
                                                                                     "The time span since server start",
                                                                                     readMethod, null);
                // 关于构造函数的元信息
                MBeanConstructorInfo mBeanConstructorInfo = new MBeanConstructorInfo("Constructor for ServerMonitor",
                                                                                     constructor);
                // ServerMonitor 的元信息,为了简单起见,在这个例子里,
                // 没有提供 invocation 以及 listener 方面的元信息
                mBeanInfo = new MBeanInfo(cls.getName(), "Monitor that controls the server",
                                          new MBeanAttributeInfo[] { upTimeMBeanAttributeInfo },
                                          new MBeanConstructorInfo[] { mBeanConstructorInfo }, null, null);
            } catch (Exception e) {
                throw new Error(e);
            }

        }
        return mBeanInfo;
    }

    @Override
    public Object invoke(String actionName, Object[] params, String[] signature) throws MBeanException,
                                                                                ReflectionException {

        Class[] parmeterClass = null;
        if (params != null) {
            parmeterClass = new Class[params.length];
            for (int i = 0; i < params.length; i++) {
                parmeterClass[i] = params[i].getClass();
            }
        }

        try {
            Method method = StandardServerMonitor.class.getMethod(actionName, parmeterClass);
            return method.invoke(monitor, params);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    public void setAttribute(Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException,
                                                 MBeanException, ReflectionException {

    }

    @Override
    public AttributeList setAttributes(AttributeList attributes) {
        return null;
    }

}

 

 

说明: 需要实现getAttribute/setAttribute的方法,包括invoke方法。 自己实现相应的监控方法路由

 

 

2. 调用例子

 

StandardServerMonitor serviceMonitor = new StandardServerMonitor();
        DynamicServerMonitor dynamicServerMonitor = new DynamicServerMonitor(serviceMonitor);
        // 注册mbean
        MBeanServer mBeanServer = MBeanServerFactory.createMBeanServer();
        ObjectName objectName = new ObjectName("objectName:id=dynamicServerMonitor");
        mBeanServer.registerMBean(dynamicServerMonitor, objectName);
        // mbean调用
        mBeanServer.invoke(objectName, "start", null, null);
        Thread.sleep(1000);
        Long upTime = (Long) mBeanServer.getAttribute(objectName, "UpTime");
        System.out.println("uptime : " + upTime);

java.lang.management系列

jvm 1.5之后默认提供了一些MBean,用于管理jvm资源,具体的MBean如下:

 

Object Name MXBean 方法描述
java.lang:type=ClassLoading ClassLoadingMXBean 包括一些类的装载信息,比如有多少类已经装载/卸载(unloaded),虚拟机类装载的 verbose 选项(即命令行中的 Java –verbose:class 选项)是否打开,还可以帮助用户打开/关闭该选项。
java.lang:type=Compilation CompilationMXBean 帮助用户了解当前的编译器和编译情况
java.lang:type=Memory MemoryMXBean 提供了整个虚拟机中内存的使用情况,包括 Java 堆(heap)和非 Java 堆所占用的内存,提供当前等待 finalize 的对象数量,它甚至可以做 gc(实际上是调用 System.gc)
java.lang:type=OperatingSystem OperatingSystemMXBean 该类提供的是操作系统的简单信息,如构架名称、当前 CPU 数、最近系统负载等
java.lang:type=Runtime RuntimeMXBean 运行时信息包括当前虚拟机的名称、提供商、版本号,以及 classpath、bootclasspath 和系统参数等等
java.lang:type=Threading ThreadMXBean 可以提供的信息包括各个线程的各种状态,CPU 占用情况,以及整个系统中的线程状况。从 ThreadMXBean 可以得到某一个线程的 ThreadInfo 对象。这个对象中则包含了这个线程的所有信息
java.lang:type=GarbageCollector GarbageCollectorMXBean 仅仅提供了 GC 的次数和 GC 花费总时间的近似值
java.lang:type=MemoryManager MemoryManagerMXBean 提供了内存管理类和内存池(memory pool)的名字信息
java.lang:type=MemoryPool MemoryPoolMXBean 在 JVM 中,可能有几个内存池,因此有对应的内存池信息,因此,在工厂类中,getMemoryPoolMXBean() 得到是一个 MemoryPoolMXBean 的 list。每一个 MemoryPoolMXBean 都包含了该内存池的详细信息,如是否可用、当前已使用内存/最大使用内存值、以及设置最大内存值等等

 

说明:

1. 通过MemoryMXBean ,可以实现内存阀值控制,比如自定义一个javax.management.NotificationListener,在内存低于MemoryNotificationInfo.MEMORY_THRESHOLD_EXCEEDED,进行消息提醒,邮件或者短信等

2. 通过ThreadMXBean ,可以通过getLockedMonitors(),getLockedSynchronizers(),getLockInfo()获取锁信息,通过findDeadlockedThreads()检测死锁

 

最后

简单的整理下jmx的相关知识,可以做为入门教程。 线上的一些监控可以通过jmx进行监控处理,做为了解还是不错的

  • 大小: 53.5 KB
分享到:
评论
1 楼 gogole_09 2011-08-05  
public interface StandardServerMonitorMBean {
  public long getUpTime();
  public void start();
}


lz 这个接口的命名貌似会有问题哦,
  会抛出 javax.management.NotCompliantMBeanException异常。
好像是要依循xxxxMXBean 这样的格式吧。

相关推荐

    tomcat深入剖析.pdf

    《深入剖析Tomcat》以Tomcat 4和Tomcat 5两个版本为基础,从建立一个最简单的连接开始,深入介绍Tomcat的体系结构。从连接器到最终的JMX管理,循序渐进,层层深入。每一章有配有相关代码,既是对理论内容的具体展现...

    Badboy-2.1_beta_2

    学习Badboy可以通过其自带的Help和Tutorial。其中Tutorial是一个简单的操作示例,一步一步地教你完成一个简单的脚本录制和回放。这个示例主要包含了设定文字检查点、Linking Values定义并基于Linking Values的循环...

    Hibernate中文详细学习文档

    4.1. 一个简单的POJO例子 4.1.1. 实现一个默认的(即无参数的)构造方法(constructor) 4.1.2. 提供一个标识属性(identifier property)(可选) 4.1.3. 使用非final的类 (可选) 4.1.4. 为持久化字段声明访问...

    《深入剖析Tomcat(中文版+英文版)》.rar

    通过学习《深入剖析Tomcat》,你将可以自行开发Tomcat组件,或者扩展已有的组件。 Tomcat是目前比较流行的Web服务器之一。作为一个开源和小型的轻量级应用服务器,Tomcat 易于使用,便于部署,但Tomcat本身是一个...

    JAVA上百实例源码以及开源项目源代码

    一个简单的CS模式的聊天软件,用socket实现,比较简单。 凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码...

    JiveJdon v4.6.1.zip

    2011年jivejdon 4.4的测试样本(Jmeter可打开):jivejdon.jmx 结果:聚合报告.jmx其最新测试结果如下,由于将数据库等操作使用异步事件实现,回帖和帖子修改等写入性操作都是基于内存领域对象实现,性能大大提高: ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    《JavaEE开发的颠覆者: Spring Boot实战》从Spring 基础、Spring MVC 基础讲起,从而无难度地引入Spring Boot 的学习。涵盖使用Spring Boot 进行Java EE 开发的绝大数应用场景,包含:Web 开发、数据访问、安全控制...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    《JavaEE开发的颠覆者: Spring Boot实战》从Spring 基础、Spring MVC 基础讲起,从而无难度地引入Spring Boot 的学习。涵盖使用Spring Boot 进行Java EE 开发的绝大数应用场景,包含:Web 开发、数据访问、安全控制...

    Hbase+Spring boot实战分布式文件存储

    实战开发通过jmx获取HBase运行时数据,监控集群状态 5-1 HBase备份与恢复 5-2 HBase监控简介 5-3 Hadoop JMX监控实战 5-4 HBase JMX监控实战 第6章 Phoenix & Sqoop 对HBase业务应用过程中常用到的第三方开源工具...

    java卡牌游戏源码-HTTPServer:基于Netty、JSON-RPC的分布式弱联网游戏服务端

    此Demo为个人兴趣所写,是本人通过半年多服务端学习的一次大胆尝试,将之前学到的很多知识都融合在一起,除了对以前的知识整合之外,也不断进行改变和创新!目前该项目还是一个简单框架,可能未来发展还会加入更多...

    支持多数据库的ORM框架ef-orm.zip

    简单直接的API 框架的API设计直接面向数据库操作,不绕弯子,开发者只需要数据库基本知识,不必学习大量新的操作概念即可使用API完成各种DDL/DML操作。 最大限度利用编译器减少编码错误的可能性 API设计和元数据...

    (2.0版本)自己写的struts2+hibernate+spring实例

    common.jar jboss-jmx.jar jboss-system.jar jacc-1_0-fr.jar jgroups-2.2.8.jar oscache-2.1.jar proxool-0.8.3.jar swarmcache-1.0rc2.jar classes12.jar spring.jar ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    《JavaEE开发的颠覆者: Spring Boot实战》从Spring 基础、Spring MVC 基础讲起,从而无难度地引入Spring Boot 的学习。涵盖使用Spring Boot 进行Java EE 开发的绝大数应用场景,包含:Web 开发、数据访问、安全控制...

    JAVA上百实例源码以及开源项目

    笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时此...

    MySQL5.1参考手册官方简体中文版

    MySQL 5.1参考手册 ... 原始参考手册为英文版,与英文版参考手册相比,本翻译版可能不是最新的。 This translation was done by MySQL partner GreatLinux, Beijing, People's Republic of China....

Global site tag (gtag.js) - Google Analytics