import java.lang.management.ManagementFactory; import java.lang.management.ThreadMXBean; import javax.management.MBeanServerConnection; import javax.management.ObjectInstance; import javax.management.ObjectName; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; import com.sun.tools.attach.VirtualMachine; /** * This example demonstrates the usage of java attach api to connect to a jvm * running locally, gets handle to ThreadMXBean proxy and prints the count * of live threads. * You have to add $(jdk-home)/lib/tools.jar in your class path to compile/run * this code. * * @author Himanshu GuptaThis can be used to build jvm monitoring tools and indeed, JConsole and JVisualVM work this way.*/ public class JmxWithAttachApiDemo { public static void main(String[] args) throws Exception { String vmid = args[0]; VirtualMachine vm = null; try { vm = VirtualMachine.attach(vmid); } catch(Exception e) { System.out.println("Failed: could not find/attach vm with id: " + vmid); e.printStackTrace(); System.exit(1); } JMXConnector jmxConn = null; try { String connectorAddress = vm.getAgentProperties() .getProperty("com.sun.management.jmxremote.localConnectorAddress"); if(connectorAddress == null) { System.out.println("Failed: jmx agent does not seem to be running."); System.exit(2); } JMXServiceURL url = new JMXServiceURL(connectorAddress); jmxConn = JMXConnectorFactory.connect(url); MBeanServerConnection mbs = jmxConn.getMBeanServerConnection(); if(mbs == null) { System.out.println("Failed: could not get mbean server connection."); System.exit(3); } ObjectName on = new ObjectName("java.lang:type=Threading"); ObjectInstance oi = mbs.getObjectInstance(on); ThreadMXBean bean = ManagementFactory.newPlatformMXBeanProxy(mbs, "java.lang:type=Threading", ThreadMXBean.class); if(bean == null) { System.out.println("Failed: could not get threading mbean."); System.exit(4); } System.out.println("Number of live threads = " + bean.getThreadCount()); System.exit(0); } finally { if(vm != null) vm.detach(); if(jmxConn != null) jmxConn.close(); } } }
References:
http://docs.oracle.com/javase/7/docs/technotes/tools/
http://docs.oracle.com/javase/7/docs/technotes/guides/management/toc.html
No comments:
Post a Comment