• [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来进行包装,最后有接口对外提供以方便使用,看下图:


  • 相关阅读:
    python中break与continue区别
    jmeter正则表达式
    python的input()函数与getpass标准库
    python实例练习-01登录
    python数据类型-字符串
    jmeter操作mysql
    jmeter文件下载
    字符逆序
    求解立方根
    求最小公倍数
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4298766.html
Copyright © 2020-2023  润新知