【问题标题】:Getting remote JVM properties using JMX使用 JMX 获取远程 JVM 属性
【发布时间】:2015-06-03 09:05:32
【问题描述】:

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

【问题讨论】:

    标签: java jvm environment-variables jmx


    【解决方案1】:

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

    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】:

      看看JMX tutorialexamples

      你想要的属性可以从RuntimeMXBean获取。

      【讨论】:

      • 您在哪里可以找到 JMX 教程中的此类示例?我已经读过了。关于 RuntimeMXBean,它是针对本地 JVM 的。否则请纠正我。还是谢谢。
      • 感谢您的澄清。更简洁:)。
      • @apangin 您的评论实际上是不正确的。请看下面我的回答。 JMX.newMXBeanProxy 不应该在这里使用。相反应该使用ManagementFactory.getPlatformMXBean。建议您删除您的评论,以免误导他人。
      【解决方案3】:

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

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

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

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

      也许这对其他人有帮助。

      注意如果有人可以提供指向支持 JMX 的系统需要 RuntimeMXBean 接口的文档的链接,那将是受欢迎的。

      【讨论】:

      • 这个答案有问题,至少对我来说。当您调用runtimeMXBean.getSystemProperties 时,它会返回实际上不是Map&lt;String,String&gt; 的内容(它是由编译器输入的,但在运行时是其他内容)。我认为使用JMX.newMXBeanProxy 是罪魁祸首。相反,我们应该使用ManagementFactory.getPlatformMXBean 来获取正确解包数据的代理。
      【解决方案4】:

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

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

      所以实际上确实对我有用,解决了所有这些陷阱,因此它可以像您可能想要的那样将系统属性作为Map&lt;String,String&gt;

      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&lt;String,String&gt; 中。改用ManagementFactory.getPlatformMXBean 方法可以避免这个问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-16
        • 1970-01-01
        • 1970-01-01
        • 2015-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多