jconsole如何在本地系统上发现启用JMX的进程?

时间:2014-04-01 03:53:31

标签: java jmx jconsole

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

enter image description here

然后我可以连接到其中一个并查看其MBeans。它是如何发现JMX流程的?我怎么能在程序中这样做?

3 个答案:

答案 0 :(得分:1)

回答,因为我也有这个问题,并得到了答案。 JDK中有一个JPS程序,它显示了java进程。 我不是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

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

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

P.S。

然后你可以使用Attach API(如提到的kostya)来发现其他需要的东西。

答案 1 :(得分:0)

This article显示了如何使用JDK tools.jar中的Attach API进行操作。

答案 2 :(得分:-1)

在您的应用程序中注册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();