访问远程MBean服务器

我正在使用JBoss运行客户端/服务器应用程序。

如何连接到服务器JVM的MBeanServer? 我想使用MemoryMX MBean来跟踪内存消耗。

我可以使用JNDI查找连接到JBoss MBeanServer,但java.lang.MemoryMX MBean未向JBoss MBeanServer注册。

编辑:要求从客户端以编程方式访问内存使用情况。

与JBoss服务器的MBeanServer不同,JVM的MBean服务器默认情况下不允许远程监控。 您需要设置各种系统属性以允许:

http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html

我写了一个这样的课:

import javax.management.remote.JMXServiceURL; import javax.management.MBeanAttributeInfo; import javax.management.MBeanInfo; import javax.management.MBeanServerConnection; import javax.management.ObjectName; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; public class JVMRuntimeClient { static void main(String[] args) throws Exception { if (args == null) { System.out.println("Usage: java JVMRuntimeClient HOST PORT"); } if(args.length < 2) { System.out.println("Usage: java JVMRuntimeClient HOST PORT"); } try { JMXServiceURL target = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://"+args[0]+":"+args[1]+"/jmxrmi"); JMXConnector connector = JMXConnectorFactory.connect(target); MBeanServerConnection remote = connector.getMBeanServerConnection(); /** * this is the part where you MUST know which MBean to get * com.digitalscripter.search.statistics:name=requestStatistics,type=RequestStatistics * YOURS WILL VARY! */ ObjectName bean = new ObjectName("com.digitalscripter.search.statistics:name=requestStatistics,type=RequestStatistics"); MBeanInfo info = remote.getMBeanInfo(bean); MBeanAttributeInfo[] attributes = info.getAttributes(); for (MBeanAttributeInfo attr : attributes) { System.out.println(attr.getDescription() + " " + remote.getAttribute(bean,attr.getName())); } connector.close(); } catch(Exception e) { System.out.println(e.getMessage()); System.exit(0); } } } 

IBM文章中的代码示例: link

  MBeanServerConnection serverConn; try { //connect to a remote VM using JMX RMI JMXServiceURL url = new JMXServiceURL( "service:jmx:rmi:///jndi/rmi://"); JMXConnector jmxConnector = JMXConnectorFactory.connect(url); serverConn = jmxConnector.getMBeanServerConnection(); ObjectName objName = new ObjectName(ManagementFactory.RUNTIME_MXBEAN_NAME); // Get standard attribute "VmVendor" String vendor = (String) serverConn.getAttribute(objName, "VmVendor"); } catch (...) { } 

您是否尝试启动JConsole$JAVA_HOME/bin )来连接服务器? 您应该能够从那里查看内存统计信息

以下代码列出了给定(启用jmx)的Java应用程序的所有mbeans ,其属性和操作按域分组。 只需使用固定的jmx端口启动您想要监控的Java应用程序,例如使用这些vm参数:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port = 9000
-Dcom.sun.management.jmxremote.local.only = FALSE
-Dcom.sun.management.jmxremote.ssl = FALSE
-Dcom.sun.management.jmxremote.authenticate = FALSE

然后运行这个主要:

 import javax.management.*; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; import java.io.IOException; public class JmxListAll { public static void main(String[] args) throws IOException, MalformedObjectNameException, IntrospectionException, InstanceNotFoundException, ReflectionException { /* 1. JMXServiceURL. */ String jmxHost = "localhost:9000"; // exactly like jconsole localhost:9026 String url = "service:jmx:rmi:///jndi/rmi://" + jmxHost + "/jmxrmi"; JMXServiceURL serviceURL = new JMXServiceURL(url); /* 2. JMXConnector and the actual serverConnection */ JMXConnector connector = JMXConnectorFactory.connect(serviceURL); MBeanServerConnection serverConnection = connector.getMBeanServerConnection(); /* 3. Walk through the domains and their objects */ System.out.println("\n Now we have a look at " + serverConnection.getMBeanCount() + " mbeans!"); int objectCount = 0; for (String domain : serverConnection.getDomains()) { System.out.println("\n***********************************************************************************"); System.out.println("DOMAIN: " + domain); // query all the beans for this domain using a wildcard filter for (ObjectName objectName : serverConnection.queryNames(new ObjectName(domain + ":*"), null)) { System.out.println(" objectName " + ++objectCount + ": " + objectName); MBeanInfo info = serverConnection.getMBeanInfo(objectName); for (MBeanAttributeInfo attr : info.getAttributes()) { System.out.print(" attr: " + attr.getDescription()); try { String val = serverConnection.getAttribute(objectName, attr.getName()).toString(); System.out.println(" -> " + abbreviate(val)); } catch (Exception e) { System.out.println(" FAILED: " + e); } } for (MBeanOperationInfo op : info.getOperations()) { System.out.println(" op: " + op.getName()); } } } } static String abbreviate(String text) { if (text != null && text.length() > 42) { return text.substring(0, 42) + "..."; } else { return text; } } } 

正如您应该看到的,在java.lang域中有几个与内存相关的mbeans。 选择你需要的那个。