【问题标题】:How to get memory usage of tomcat 7 using JMX API?如何使用 JMX API 获取 tomcat 7 的内存使用情况?
【发布时间】:2012-02-09 05:48:38
【问题描述】:

是否可以使用 JMX API 获取 tomcat 服务器的内存使用统计信息。哪个 Mbean 可以为我提供此信息?我在下面的代码中卡住了 ObjectName 的形成

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 是如何绘制内存图的,有源代码的指针吗?

【问题讨论】:

    标签: java tomcat jmx


    【解决方案1】:
    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());
    

    【讨论】:

    • 上面的代码从 jvm 返回一个常量指标,而不是应用程序方面
    • 在阅读了有关复合数据类型的内容后,我理解了您的代码,谢谢
    【解决方案2】:

    获取本地/远程tomcat已用内存的代码sn-p:

     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"));
    

    【讨论】:

      【解决方案3】:

      示例代码

      List memBeans = // 获取 mbean 列表 for (Iterator 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 是一些可以提供帮助的链接

      【讨论】:

      • 如何获取 mbeans 列表我只能在 MBeanServerConnection 类中看到 getDomains()
      猜你喜欢
      • 2018-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-29
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      相关资源
      最近更新 更多