自从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