使用JMX获取远程JVM属性

时间:2015-03-30 11:11:25

标签: java jvm environment-variables jmx

在我创建JMX连接后,有人可以给我一些关于如何获取JVM属性的指南吗?我需要以编程方式获取这些信息。 我没有得到任何暗示就搜索了这个。 任何想法都将不胜感激。

4 个答案:

答案 0 :(得分:2)

查看JMX tutorialexamples

您可以从RuntimeMXBean获取所需的属性。

答案 1 :(得分:0)

我认为最小的例子应该是这样的:

public class JMXSystemProperties {

public static void main(String[] args) throws Exception {
    JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9004/jmxrmi");
    JMXConnector jmxc = JMXConnectorFactory.connect(url, null);

    MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
    TabularDataSupport data = (TabularDataSupport) mbsc.getAttribute(new ObjectName("java.lang:type=Runtime"), "SystemProperties");
    for (Entry<Object, Object> entry : data.entrySet()) {
        CompositeDataSupport value = (CompositeDataSupport) entry.getValue();
        System.out.println(entry.getKey() + " = " + value.values());
    }
}
}

您仍然可以使用jvisualvm查看所有数据是否正确。

您可以将url中的localhost和端口9004替换为更适合您的服务器和端口。

由于

答案 2 :(得分:0)

作为提示:在连接到JMX之后,我认为有一个标准的MXBean接口,它实现了java.lang.management.RuntimeMXBean。相关的ObjectName应为:

ObjectName objName = new ObjectName("java.lang:type=Runtime");

获取代理实例对象就是这样:

RuntimeMXBean runtimeMXBean = JMX.newMXBeanProxy(mbeanServer, objName, RuntimeMXBean.class, true);

也许这会帮助别人。

N.B。如果某人可以提供指向JMX系统RuntimeMXBean接口需要的文档的链接,那将是受欢迎的。

答案 3 :(得分:0)

已经提供的答案中没有一个对我真正有用。我遇到了一些问题:

  • 可接受的答案不过是指向文档的指针,这没有错,但是在确定所有细节方面没有真正的帮助。
  • 如果只想获取系统属性图,
  • TabularDataSupport可以解压缩一些PITA。 (这些键将包装在列表中,并且必须解压; TabularDataSupport Map的“值”实际上不是您想要的值...但仍包装在“ CompositeDataSupport”对象中,该对象也必须进一步解压)。
  • 使用JMX.newMXBeanProxy看起来很有希望避免所有此类拆包。但是,尽管它可以在运行时进行编译,但是我发现来自代理getSystemProperties的结果实际上并没有正确地解压缩。它仍然是一个TabularDataSupport对象(是的,即使它的编译时类型表明它应该是Map<String,String>,实际上不是)。

所以这实际上对我有用,在解决了所有这些陷阱之后,它们为我提供了系统属性,就像您可能想要的那样Map<String,String>

package example;

import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.util.Map;
import java.util.Map.Entry;

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

public class GetJmxSystemProps {

    public static void main(String[] args) throws Exception {
        JMXServiceURL serviceUrl =  new JMXServiceURL("service:jmx:rmi://localhost:9111/jndi/rmi://localhost:9111/jmxrmi");
        JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceUrl, null);
        MBeanServerConnection connection = jmxConnector.getMBeanServerConnection();
        RuntimeMXBean proxy = ManagementFactory.getPlatformMXBean(connection, RuntimeMXBean.class);
        Map<String, String> sysprops = proxy.getSystemProperties();
        for (Entry<String, String> e : sysprops.entrySet()) {
            System.out.println(e.getKey()+"="+e.getValue());
        }
    }
}

总结:这里的关键是使用JMX.newMXBeanProxy获取类型为RuntimeMXBean的bean是错误的,不能正确地将TabularDataSupport对象解压缩到Map<String,String>中。通过使用方法ManagementFactory.getPlatformMXBean可以避免此问题。