【发布时间】:2014-04-01 03:53:31
【问题描述】:
当我运行 jconsole 时,它会显示 Java 进程列表:
然后我可以连接到其中一个并查看其MBeans。它如何发现 JMX 进程?如何在程序中做到这一点?
【问题讨论】:
当我运行 jconsole 时,它会显示 Java 进程列表:
然后我可以连接到其中一个并查看其MBeans。它如何发现 JMX 进程?如何在程序中做到这一点?
【问题讨论】:
This article 展示了如何使用 JDK tools.jar 中的 Attach API 来完成此操作
【讨论】:
回复,因为我也有这个问题并得到了答案。 JDK中有一个显示java进程的JPS程序。 我不是 100% 确定(不想深入研究 jconsole 代码),但 99% 确定 jconsole 使用与 jps 相同的机制:
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 文件中填充的:
以下是了解更多信息的链接: 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 所述)来发现其余需要的东西。
【讨论】:
在应用程序中注册 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();
【讨论】: