dev2dev.bea.com.cn
首页 资源中心 dev2dev学堂 在线技术论坛 专家Blog User Group CodeShare

公开JRockit JVM的内部性能计数器

2006-01-05 00:00:00 | 评论 (0) | 被访问(1026)次

Marcus Hirt
  Marcus Hirt 是斯德哥尔摩JRockit工具团队的团队领导。他的工作主要是M&M (JSR-174)、JMAPI (JRockit Management API)、JVMTI和JRockit Mission Control。在工作之余,他喜欢编曲和编写好玩的Java项目。


  自从Java 1.3 JRockit提供了一个管理代理,JVM管理应用程序(如:JRockit Management Console)就一直使用它来远程收集有关JVM的数据。自JRockit 5.0以来,JRockit中的管理代理就是基于JMX的。有关JMX以及平台MBean服务器的更多信息,请参见Overview of Monitoring and Management

  为了提供一种简单的公开JRockit内部计数器的方法,我创建了一个动态MBean,它位于com.jrockit域中,其ObjectName为com.jrockit:type=JrockitPerfCounters。动态MBean不像静态MBean那样提供静态借口;它动态生成元数据,并提供将属性名映射到要检索的数据的accessor方法。

  因此JRockitPerfCounter MBean自动公开了所有的内部性能计数器。只要JVM开发人员添加了一个性能计数器,它就会自动由JRockitPerfCounter MBean公开。

  下面的例子说明了如何读取JRockit性能计数器:

import java.lang.management.ManagementFactory;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.Map;

import javax.management.MBeanAttributeInfo;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;


/**
 * Simple code example that can be used to read the JRockit perfounters.
 * 
 * Usage: ReadPerfCounter -host  -port  -user
 *  -pass  -counter 
 *
 * All arguments are optional. If no counter is specified, all counters are
 * listed.
 * 
 * @author Marcus Hirt
 */
public class ReadPerfCounter
{
   private final static String KEY_CREDENTIALS   = "jmx.remote.credentials";
   private final static String JROCKIT_PERFCOUNTER_MBEAN_NAME =
      "com.jrockit:type=JRockitPerfCounters";
   
   public static void main(String[] args) throws Exception
   {
      HashMap commandMap = new HashMap();
      commandMap.put("-host", "localhost");
      commandMap.put("-port", "7091");
      for (int i = 0; i < args.length; i++)
      {
         if (args[i].startsWith("-"))
         {
            if (i + 1 < args.length)
            {
               commandMap.put(args[i], args[i + 1]);
            }
            else
            {
               System.err.println("Command " + args[i] + " lacks argument!");
            }
         }
      }
      executeCommand(commandMap.get("-host"), Integer.parseInt(commandMap.get("-port")),
            commandMap.get("-user"), commandMap.get("password"), commandMap.get("-counter"));
   }

   public static void executeCommand(String host, int port, String user, String password,
         String counter) throws Exception
   {
      MBeanServerConnection server = null;
      JMXConnector jmxc = null;
      Map map = null;
      if (user != null || password != null)
      {
         map = new HashMap();
         final String[] credentials = new String[2];
         credentials[0] = user;
         credentials[1] = password;
         map.put(KEY_CREDENTIALS, credentials);
      }
      // Use same convention as Sun. localhost:0 means "VM, monitor thyself!"
      if (host.equals("localhost") && port == 0)
      {
         server = ManagementFactory.getPlatformMBeanServer();
      }
      else
      {
         jmxc = JMXConnectorFactory.newJMXConnector(
                   createConnectionURL(host, port), map);
         jmxc.connect();
         server = jmxc.getMBeanServerConnection();
      }

      if (counter == null)
      {
         System.out.println("listing all counters...");
         MBeanAttributeInfo [] attributes = server.getMBeanInfo(
            new ObjectName(JROCKIT_PERFCOUNTER_MBEAN_NAME)).getAttributes();
         System.out.println("Counter\tType\n=======\t====");
         for (MBeanAttributeInfo info : attributes)
         {
            System.out.println(info.getName() + "\t"
               + info.getType());
         }
      }
      else
      {
         System.out.println("Counter " + counter + " = " 
            + server.getAttribute(new ObjectName(JROCKIT_PERFCOUNTER_MBEAN_NAME), counter));
      }
      
      if (jmxc != null)
      {
         jmxc.close();
      }
   }
   
   private static JMXServiceURL createConnectionURL(String host, int port) 
      throws MalformedURLException
   {
      return new JMXServiceURL("rmi", "", 0, "/jndi/rmi://" 
         + host + ":" + port + "/jmxrmi");
   }
}

  下面的命令行可以从一个具有(从localhost:7091启动的)管理代理的JVM获取活动线程的数目而无需使用证书:
  java ReadPerfCounter java.threads.live

  下面的命令行则会列出所有具有一个运行在端口4711上的管理代理、名为bitsy的主机上的计数器,用户marcus使用口令hemligt:
  java ReadPerfCounter -host bitsy -port 4711 -user marcus -pass hemligt

  不要忘记使用-Xmanagement标志启动要连接到的JRockit JVM:
  java -Xmanagement <your program>

  有关-Xmanagment选项的更多信息,请参见Management Console文档

本文出处:http://dev2dev.bea.com/blog/hirt/archive/2005/11/the_jrockit_jvm_1.html



Tags: JRockit performance counter MBean 性能计数器
文章评论:(以下网友留言只代表个人观点,不代表BEA观点和立场)
暂时没有评论!

2006年01月

            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
RSS订阅

Marcus Hirt's Blog搜索