2012-02-09 59 views
4

是否有可能使用JMX API获取tomcat服务器的内存使用情况统计信息。哪个Mbean可以提供给我这个信息?我停留在对象名的形成,下面的代码如何使用JMX API获取tomcat 7的内存使用情况?

JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:2020/jmxrmi"); 
JMXConnector jmxc = JMXConnectorFactory.connect(url); 
MBeanServerConnection server = jmxc.getMBeanServerConnection(); 

    Object o = jmxc.getMBeanServerConnection().getAttribute(
      new ObjectName("-----"); 

奇迹JConsole的是如何绘制的图形内存,任何指针的源代码?

回答

4
MBeanServer connection = ManagementFactory.getPlatformMBeanServer(); 
Set<ObjectInstance> set = connection.queryMBeans(new ObjectName("java.lang:type=Memory"), null); 
ObjectInstance oi = set.iterator().next(); 
// replace "HeapMemoryUsage" with "NonHeapMemoryUsage" to get non-heap mem 
Object attrValue = connection.getAttribute(oi.getObjectName(), "HeapMemoryUsage"); 
if(!(attrValue instanceof CompositeData)) { 
    System.out.println("attribute value is instanceof [" + attrValue.getClass().getName() + 
      ", exitting -- must be CompositeData."); 
    return; 
} 
// replace "used" with "max" to get max 
System.out.println(((CompositeData)attrValue).get("used").toString()); 
+0

上述一些链接代码是从jvm返回一个常量指标,而不是应用程序明智 – sanre6 2012-02-10 01:14:23

+0

我在阅读有关复合数据类型后了解您的代码,谢谢 – sanre6 2012-02-14 04:19:17

+0

它的工作原理!谢谢! – Gaucho 2013-02-08 11:13:49

1

示例代码

列表memBeans = //获得的mbeans 的列表(迭代器I = memBeans.iterator(); i.hasNext();){

MemoryPoolMXBean mpool = (MemoryPoolMXBean)i.next(); 
MemoryUsage usage = mpool.getUsage(); 

String name = mpool.getName();  
float init = usage.getInit()/1000; 
float used = usage.getUsed()/1000; 
float committed = usage.getCommitted()/1000; 
float max = usage.getMax()/1000; 
float pctUsed = (used/max)*100; 
float pctCommitted = (committed/max)*100; 

}

herehere有一些链接,可以帮助

+0

如何获得的MBean我只能看到getDomains()中的MBeanServerConnection类的列表 – sanre6 2012-02-09 06:15:31

+0

我已经更新了我的答案,包括 – 2012-02-09 06:19:02

3

为获得使用内存本地/远程tomcat的代码片段:

JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://{remote ip/localhost}:2020/jmxrmi"); 
     JMXConnector jmxc = JMXConnectorFactory.connect(url); 
     MBeanServerConnection server = jmxc.getMBeanServerConnection(); 
     Object o = jmxc.getMBeanServerConnection().getAttribute(new ObjectName("java.lang:type=Memory"), "HeapMemoryUsage"); 
     CompositeData cd = (CompositeData) o; 
     System.out.println(cd.get("used"));