如何获取远程jmx URL的java中的所有垃圾收集器MX bean?

如何获取远程jmx URL的java中的所有垃圾收集器MX bean?,java,garbage-collection,jmx,mbeans,Java,Garbage Collection,Jmx,Mbeans,我有一个jmx远程url,我想获得它通过jmx公开的所有GC相关信息。我正在使用以下代码: MBeanServerConnection conn = getMBeanServerConnection(url); if (conn != null) return ManagementFactory.newPlatformMXBeanProxy(conn, ManagementFactory.GARBAGE_COLLECTOR_MXBEAN_DOMAIN_TY

我有一个jmx远程url,我想获得它通过jmx公开的所有GC相关信息。我正在使用以下代码:

MBeanServerConnection conn = getMBeanServerConnection(url);
        if (conn != null)
            return ManagementFactory.newPlatformMXBeanProxy(conn, ManagementFactory.GARBAGE_COLLECTOR_MXBEAN_DOMAIN_TYPE, GarbageCollectorMXBean.class);
return null;
这里的问题是我没有定义名称和唯一的类型,所以它给出了异常。因此,我对名称的定义如下:

    return ManagementFactory.newPlatformMXBeanProxy(conn, ManagementFactory.GARBAGE_COLLECTOR_MXBEAN_DOMAIN_TYPE+",name=PS MarkSweep", GarbageCollectorMXBean.class);

但这里我硬编码了“PS MarkSweep”。但是JVM可能正在使用“ConcurrentMarkSweep”。如何获取所有GC MBean的列表?

您可以通过对MBeanServer连接发出MBean查询来实现这一点,如下所示:

MBeanServerConnection mbs = ManagementFactory.getPlatformMBeanServer();
Set<ObjectName> gcnames = mbs.queryNames(new ObjectName(ManagementFactory.GARBAGE_COLLECTOR_MXBEAN_DOMAIN_TYPE + ",name=*"), null);
Set<GarbageCollectorMXBean> gcBeans = new HashSet<GarbageCollectorMXBean>(gcnames.size());
for(ObjectName on: gcnames) {
    gcBeans.add(ManagementFactory.newPlatformMXBeanProxy(mbs, on.toString(), GarbageCollectorMXBean.class));
}
MBeanServer连接mbs=ManagementFactory.getPlatformMBeanServer();
设置gcnames=mbs.queryNames(新对象名(ManagementFactory.GARBAGE\u COLLECTOR\u MXBEAN\u DOMAIN\u TYPE+”,name=*”,null);
Set gcBeans=newhashset(gcnames.size());
for(上的ObjectName:gcnames){
add(ManagementFactory.newPlatformMXBeanProxy(mbs,on.toString(),GarbageCollectorMXBean.class));
}

现在,gcBeans集合为每个垃圾收集器加载了一个垃圾收集器MXBean。

因为您连接到远程JVM,所以应该使用
jmxConn.getMBeanServerConnection()
而不是
ManagementFactory.getPlatformMBeanServer()