zoukankan      html  css  js  c++  java
  • [Java]JMX

    在JVM中有一些经常使用的MBeans,能够写个代码获取到:

    public class Test {
        public static void main(String[] args) throws Exception {
            MBeanServer server = ManagementFactory.getPlatformMBeanServer();
            Set instances = server.queryMBeans(null, null);
            Iterator iterator = instances.iterator();
            while (iterator.hasNext()) {
                ObjectInstance instance = (ObjectInstance) iterator.next();
                System.out.println("MBean Found:");
                System.out.println("Class Name:	" + instance.getClassName());
                System.out.println("Object Name:	" + instance.getObjectName());
                System.out.println("****************************************");
            }
        }
    }

    依据列表,我们就能通过MBean来获取想要的信息了,比方获取Code Cache的大小:

    public class TestMBean {
        final static String pid               = "6228";
        final static String CONNECTOR_ADDRESS = "com.sun.management.jmxremote.localConnectorAddress";
    
        public static void main(String[] args) throws Exception {
            VirtualMachine vm = VirtualMachine.attach(pid);
            JMXConnector connector = null;
            String connectorAddress = vm.getAgentProperties().getProperty(CONNECTOR_ADDRESS);
    
            String agent = vm.getSystemProperties().getProperty("java.home") + File.separator + "lib" + File.separator
                    + "management-agent.jar";
            vm.loadAgent(agent);
    
            connectorAddress = vm.getAgentProperties().getProperty(CONNECTOR_ADDRESS);
            JMXServiceURL url = new JMXServiceURL(connectorAddress);
            connector = JMXConnectorFactory.connect(url);
            MBeanServerConnection mbeanConn = connector.getMBeanServerConnection();
            ObjectName name = new ObjectName("java.lang:type=MemoryPool,name=Code Cache");
            System.out.println(mbeanConn.getAttribute(name, "Usage"));
    
            if (connector != null) {
                connector.close();
            }
            vm.detach();
        }
    }

    实际上通过ObjectName("java.lang:type=MemoryPool,name=Code Cache")得到的类为:

    sun.management.MemoryPoolImpl

    而在getAttribute(name, "Usage")的时候相应调用的方法为:

    public java.lang.management.MemoryUsage getUsage(){}

    其它MBean的使用方法和这个类似。


    ---------- ---------- ---------- ---------- ----------风格线---------- ---------- ---------- ---------- ----------


    假设系统的MBean不能满足须要,那么我们能够自定义MBean,比方标准的MBean例如以下:

    // 标准的MBean有几个限制:1、必须实现接口 2、必须有public类型的构造函数 3、命名规则
    public class My implements MyMBean {
        public String getHello() {
            return "hello world";
        }
    }
    public interface MyMBean {
        public String getHello();
    }
    接下来能够将这个MBean增加MBeanServer:
    public class Test {
        public static final void main(String[] args) throws Exception {
            MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
            ObjectName objectName = new ObjectName("com.wszt:type=MyMBean");
            mBeanServer.createMBean("My", objectName);
        }
    }

    attach&用法和上面的一样,不赘述。除了标准的MBean还有Dynamic MBean、Model Bean、Open MBean,用法类似。


    ---------- ---------- ---------- ---------- ----------风格线---------- ---------- ---------- ---------- ----------


    简单来看JMX是一个JVM的管理框架,MBean是对资源的封装,然后后AGENT来进行包装,最后有接口对外提供以方便使用,看下图:


  • 相关阅读:
    Linux:DHCP服务配置
    调整 全局jvm 大小 tomcat 调整jvm大小
    Arts打卡第8周
    mysql 对返回的值是null进行判断和重新赋值
    从xml中返回的对象,和new 返回的对象时不同的。
    检查时异常和运行是异常 + 事务回滚 +隔离级别
    怎么在for循环中新建出不同的list
    mysql中查询某个字段重复的数据
    Arts打卡第7周
    将Excel文件导入到Navicat Premium中日期变为0000-00-00
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4298766.html
Copyright © 2011-2022 走看看