【问题标题】:How does jconsole discover the JMX enabled processes on local system?jconsole 如何发现本地系统上启用 JMX 的进程?
【发布时间】:2014-04-01 03:53:31
【问题描述】:

当我运行 jconsole 时,它会显示 Java 进程列表:

然后我可以连接到其中一个并查看其MBeans。它如何发现 JMX 进程?如何在程序中做到这一点?

【问题讨论】:

    标签: java jmx jconsole


    【解决方案1】:

    This article 展示了如何使用 JDK tools.jar 中的 Attach API 来完成此操作

    【讨论】:

      【解决方案2】:

      回复,因为我也有这个问题并得到了答案。 JDK中有一个显示java进程的JPS程序。 我不是 100% 确定(不想深入研究 jconsole 代码),但 99% 确定 jconsole 使用与 jps 相同的机制:

      http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/sun/tools/jps/Jps.java?av=f

      HostIdentifier hostId = arguments.hostId();
      MonitoredHost monitoredHost = MonitoredHost.getMonitoredHost(hostId);
      // get the set active JVMs on the specified host.
      Set<Integer> jvms = monitoredHost.activeVms();
      

      这些类是 tools.jar 的一部分,您需要将它包含在项目的类路径中。

      如果我们更深入(我没有公开所有中间步骤) - 最后我们会知道活动虚拟机列表是从临时目录中的 hsperfdata 文件中填充的:

      http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/sun/jvmstat/perfdata/monitor/protocol/local/PerfDataFile.java

      以下是了解更多信息的链接: java hsperfdata directory

      最后,这里有一段代码 sn-p 允许您获取 java 进程 ID:

      sun.jvmstat.monitor.MonitoredHost host = sun.jvmstat.monitor.MonitoredHost.getMonitoredHost(new sun.jvmstat.monitor.HostIdentifier((String) null));
      System.out.println(host.activeVms());
      

      附言

      然后您可以使用 Attach API(如 kostya 所述)来发现其余需要的东西。

      【讨论】:

        【解决方案3】:

        在应用程序中注册 MBean 后,如下所示:

        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
        //register the MBean
        ObjectMbean mBean = new ObjectMbean();
        ObjectName name = new ObjectName("com.gd.eventfiltering.jmx:type=SystemConfig");
        mbs.registerMBean(mBean, name);
        

        然后你可以像这样调用你的 MBean:

        JMXServiceURL url = new JMXServiceURL(JMX_PATH);
        JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
        MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
        ObjectName mbeanName = new ObjectName(JMX_OBJECT);
        
        IObjectMbean  mbeanProxy = JMX.newMBeanProxy(mbsc, mbeanName,IObjectMbean.class, false);
        
        //call the method
        List<EventType> filters = mbeanProxy.methodFromYourMBean();
        
        
        jmxc.close();
        

        【讨论】:

        • -1 因为这没有回答“它如何发现 JMX 进程”的问题
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-25
        • 1970-01-01
        • 2011-04-21
        • 2015-02-22
        • 1970-01-01
        • 2017-02-15
        相关资源
        最近更新 更多