获取JVM运行状况的几种方式

我们可以通过JMX的方式读取到JVM Manage定义的MBean,如下是3种获取方法
     1.监控应用与被监控应用位于同一JVM

Java代码   收藏代码
  1. MBeanServer server = ManagementFactory.getPlatformMBeanServer();  
  2. RuntimeMXBean rmxb = ManagementFactory.newPlatformMXBeanProxy(server,  
  3.                 "java.lang:type=Runtime", RuntimeMXBean.class);  

      2.监控应用与被监控应用不位于同一JVM
      1)首先在被监控的JVM的启动参数中加入如下的启动参数以启JVM代理

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=127.0.0.1:8000 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false

      2)连接到代理上

Java代码   收藏代码
  1. JMXServiceURL url = new JMXServiceURL(  
  2.         "service:jmx:rmi:///jndi/rmi://127.0.0.1:8000/jmxrmi");  
  3. JMXConnector connector = JMXConnectorFactory.connect(url);  
  4. RuntimeMXBean rmxb = ManagementFactory.newPlatformMXBeanProxy(connector  
  5.             .getMBeanServerConnection(),"java.lang:type=Runtime",  
  6.                 RuntimeMXBean.class);  

     3.监控应用与被监控应用不位于同一JVM但在同一物理主机上(2的特化情况,通过进程Attach)
       我们使用JDK工具,如jmap、jstack等的时候,工具所在的JVM当然与被监控的JVM不是同一个,所以不能使用方式1,被监控的JVM一般也不会在启动参数中增加JMX的支持,所以方式2也没有办法。还好Sun JVM给我们提供了第3种非标准的方式,就是通过Attach到被监控的JVM进程,并在被监控的JVM中启动一个JMX代理,然后使用该代理通过2的方式连接到被监控的JVM的JMX上。下面是一个使用范例,由于里面使用到的知识涉及到Java Instrutment(JVMTI的一个技术的Java实现)和Attach API,因此此处不做详细解析,在后续看完Java Instrutment和Attach API自然就会明白。(注意,仅在JDK6+中支持,另外,运行需要jdk的tools.jar包)

Java代码   收藏代码
  1. //Attach 到5656的JVM进程上,后续Attach API再讲解  
  2. VirtualMachine virtualmachine = VirtualMachine.attach("5656");  
  3.   
  4. //让JVM加载jmx Agent,后续讲到Java Instrutment再讲解  
  5. String javaHome = virtualmachine.getSystemProperties().getProperty("java.home");  
  6. String jmxAgent = javaHome + File.separator + "lib" + File.separator + "management-agent.jar";  
  7. virtualmachine.loadAgent(jmxAgent, "com.sun.management.jmxremote");  
  8.   
  9. //获得连接地址  
  10. Properties properties = virtualmachine.getAgentProperties();  
  11. String address = (String)properties.get("com.sun.management.jmxremote.localConnectorAddress");  
  12.          
  13. //Detach  
  14. virtualmachine.detach();  
  15.          
  16. JMXServiceURL url = new JMXServiceURL(address);  
  17. JMXConnector connector = JMXConnectorFactory.connect(url);  
  18. RuntimeMXBean rmxb = ManagementFactory.newPlatformMXBeanProxy(connector  
  19.                 .getMBeanServerConnection(), "java.lang:type=Runtime",RuntimeMXBean.class);  

      三、结束语
      可以看到,通过标准的接口,我们已经可以获得运行的JVM很详细的信息,从运行JVM、操作系统,到内存、GC和线程,通过这些标准的接口我们已经可以对JVM进行功能完善的监控。但是仅此是不够的,这部分接口描述的主要是JVM的总体性的信息,而无法提供更多的细节。在下一部分,我们将使用JPDA来更深入地了解JVM内部信息更细节的信息,并了解我们如何通过JVM TI实现自动的性能监控

你可能感兴趣的:(获取JVM运行状况的几种方式)