How do I programmatically dump JMX data?

Stefan Kendall picture Stefan Kendall · Feb 25, 2010 · Viewed 13.3k times · Source

I want to be able to log all JMX data accessible via jconsole. Is there a way to do this programmatically? I'm building a form of logging of the system, and I want to create intervaled data viewable with some tool similar to jconsole.

How would I go about doing this?

Answer

stacker picture stacker · Feb 25, 2010

java.lang.management.ManagementFactory gives you access to JMX data.

i.g.

List<MemoryPoolMXBean> memPoolBeans = ManagementFactory.getMemoryPoolMXBeans();
for (MemoryPoolMXBean mpb : memPoolBeans) {
    System.out.println("Memory Pool: " + mpb.getName());
}

Some samples are available at SO query: [java]+managementfactory

A good read: https://www.ibm.com/developerworks/library/j-jtp09196/index.html

For full implementation connecting to a remote VM:

Map<String,String[]> env = new HashMap<String, String[]>();
env.put( JMXConnector.CREDENTIALS, new String[]{"user","pass"} );
JMXServiceURL address = new JMXServiceURL("service:rmi:///jndi/rmi://host:port/jmxrmi");
JMXConnector connector = JMXConnectorFactory.connect(address,env);
MBeanServerConnection mbs = connector.getMBeanServerConnection();

//get all mbeans
Set<ObjectInstance> beans = mbs.queryMBeans(null,null);

for( ObjectInstance instance : beans )
{
    MBeanInfo info = mbs.getMBeanInfo( instance.getObjectName() );
}

From the info, you can query object names and attributes as desired.