--- old/src/share/classes/java/lang/management/PlatformComponent.java Mon Mar 28 11:54:15 2011 +++ new/src/share/classes/java/lang/management/PlatformComponent.java Mon Mar 28 11:54:15 2011 @@ -29,9 +29,9 @@ import java.util.Collections; import java.util.List; import java.util.HashSet; +import java.util.HashMap; +import java.util.Map; import java.util.Set; -import java.util.logging.PlatformLoggingMXBean; -import java.nio.BufferPoolMXBean; import javax.management.MBeanServerConnection; import javax.management.ObjectName; @@ -66,6 +66,7 @@ CLASS_LOADING( "java.lang.management.ClassLoadingMXBean", "java.lang", "ClassLoading", defaultKeyProperties(), + true, // singleton new MXBeanFetcher() { public List getMXBeans() { return Collections.singletonList(ManagementFactoryHelper.getClassLoadingMXBean()); @@ -78,6 +79,7 @@ COMPILATION( "java.lang.management.CompilationMXBean", "java.lang", "Compilation", defaultKeyProperties(), + true, // singleton new MXBeanFetcher() { public List getMXBeans() { CompilationMXBean m = ManagementFactoryHelper.getCompilationMXBean(); @@ -95,6 +97,7 @@ MEMORY( "java.lang.management.MemoryMXBean", "java.lang", "Memory", defaultKeyProperties(), + true, // singleton new MXBeanFetcher() { public List getMXBeans() { return Collections.singletonList(ManagementFactoryHelper.getMemoryMXBean()); @@ -107,6 +110,7 @@ GARBAGE_COLLECTOR( "java.lang.management.GarbageCollectorMXBean", "java.lang", "GarbageCollector", keyProperties("name"), + false, // zero or more instances new MXBeanFetcher() { public List getMXBeans() { return ManagementFactoryHelper. @@ -120,6 +124,7 @@ MEMORY_MANAGER( "java.lang.management.MemoryManagerMXBean", "java.lang", "MemoryManager", keyProperties("name"), + false, // zero or more instances new MXBeanFetcher() { public List getMXBeans() { return ManagementFactoryHelper.getMemoryManagerMXBeans(); @@ -133,6 +138,7 @@ MEMORY_POOL( "java.lang.management.MemoryPoolMXBean", "java.lang", "MemoryPool", keyProperties("name"), + false, // zero or more instances new MXBeanFetcher() { public List getMXBeans() { return ManagementFactoryHelper.getMemoryPoolMXBeans(); @@ -145,6 +151,7 @@ OPERATING_SYSTEM( "java.lang.management.OperatingSystemMXBean", "java.lang", "OperatingSystem", defaultKeyProperties(), + true, // singleton new MXBeanFetcher() { public List getMXBeans() { return Collections.singletonList(ManagementFactoryHelper.getOperatingSystemMXBean()); @@ -157,6 +164,7 @@ RUNTIME( "java.lang.management.RuntimeMXBean", "java.lang", "Runtime", defaultKeyProperties(), + true, // singleton new MXBeanFetcher() { public List getMXBeans() { return Collections.singletonList(ManagementFactoryHelper.getRuntimeMXBean()); @@ -169,6 +177,7 @@ THREADING( "java.lang.management.ThreadMXBean", "java.lang", "Threading", defaultKeyProperties(), + true, // singleton new MXBeanFetcher() { public List getMXBeans() { return Collections.singletonList(ManagementFactoryHelper.getThreadMXBean()); @@ -180,11 +189,17 @@ * Logging facility. */ LOGGING( - "java.util.logging.PlatformLoggingMXBean", + "java.lang.management.PlatformLoggingMXBean", "java.util.logging", "Logging", defaultKeyProperties(), + true, // singleton new MXBeanFetcher() { public List getMXBeans() { - return ManagementFactoryHelper.getLoggingMXBean(); + PlatformLoggingMXBean m = ManagementFactoryHelper.getPlatformLoggingMXBean(); + if (m == null) { + return Collections.emptyList(); + } else { + return Collections.singletonList(m); + } } }), @@ -192,8 +207,9 @@ * Buffer pools. */ BUFFER_POOL( - "java.nio.BufferPoolMXBean", + "java.lang.management.BufferPoolMXBean", "java.nio", "BufferPool", keyProperties("name"), + false, // zero or more instances new MXBeanFetcher() { public List getMXBeans() { return ManagementFactoryHelper.getBufferPoolMXBeans(); @@ -209,6 +225,7 @@ SUN_GARBAGE_COLLECTOR( "com.sun.management.GarbageCollectorMXBean", "java.lang", "GarbageCollector", keyProperties("name"), + false, // zero or more instances new MXBeanFetcher() { public List getMXBeans() { return getGcMXBeanList(com.sun.management.GarbageCollectorMXBean.class); @@ -222,6 +239,7 @@ SUN_OPERATING_SYSTEM( "com.sun.management.OperatingSystemMXBean", "java.lang", "OperatingSystem", defaultKeyProperties(), + true, // singleton new MXBeanFetcher() { public List getMXBeans() { return getOSMXBeanList(com.sun.management.OperatingSystemMXBean.class); @@ -234,6 +252,7 @@ SUN_UNIX_OPERATING_SYSTEM( "com.sun.management.UnixOperatingSystemMXBean", "java.lang", "OperatingSystem", defaultKeyProperties(), + true, // singleton new MXBeanFetcher() { public List getMXBeans() { return getOSMXBeanList(com.sun.management.UnixOperatingSystemMXBean.class); @@ -246,6 +265,7 @@ HOTSPOT_DIAGNOSTIC( "com.sun.management.HotSpotDiagnosticMXBean", "com.sun.management", "HotSpotDiagnostic", defaultKeyProperties(), + true, // singleton new MXBeanFetcher() { public List getMXBeans() { return Collections.singletonList(ManagementFactoryHelper.getDiagnosticMXBean()); @@ -296,21 +316,12 @@ private final Set keyProperties; private final MXBeanFetcher fetcher; private final PlatformComponent[] subComponents; + private final boolean singleton; private PlatformComponent(String intfName, String domain, String type, Set keyProperties, - MXBeanFetcher fetcher) { - this.mxbeanInterfaceName = intfName; - this.domain = domain; - this.type = type; - this.keyProperties = keyProperties; - this.fetcher = fetcher; - this.subComponents = new PlatformComponent[0]; - } - private PlatformComponent(String intfName, - String domain, String type, - Set keyProperties, + boolean singleton, MXBeanFetcher fetcher, PlatformComponent... subComponents) { this.mxbeanInterfaceName = intfName; @@ -317,6 +328,7 @@ this.domain = domain; this.type = type; this.keyProperties = keyProperties; + this.singleton = singleton; this.fetcher = fetcher; this.subComponents = subComponents; } @@ -338,6 +350,10 @@ return set; } + boolean isSingleton() { + return singleton; + } + String getMXBeanInterfaceName() { return mxbeanInterfaceName; } @@ -360,10 +376,37 @@ return fetcher.getMXBeans(); } + T getSingletonMXBean(Class mxbeanInterface) + { + if (!singleton) + throw new IllegalArgumentException(mxbeanInterfaceName + + " can have zero or more than one instances"); + + List list = fetcher.getMXBeans(); + assert list.size() == 1; + return list.isEmpty() ? null : list.get(0); + } + - List getMXBeans(MBeanServerConnection mbs, Class mxbeanInterface) + T getSingletonMXBean(MBeanServerConnection mbs, Class mxbeanInterface) throws java.io.IOException { + if (!singleton) + throw new IllegalArgumentException(mxbeanInterfaceName + + " can have zero or more than one instances"); + + // ObjectName of a singleton MXBean contains only domain and type + assert keyProperties.size() == 1; + String on = domain + ":type=" + type; + return ManagementFactory.newPlatformMXBeanProxy(mbs, + on, + mxbeanInterface); + } + + + List getMXBeans(MBeanServerConnection mbs, Class mxbeanInterface) + throws java.io.IOException + { List result = new ArrayList<>(); for (ObjectName on : getObjectNames(mbs)) { result.add(ManagementFactory. @@ -391,5 +434,34 @@ return set; } + // a map from MXBean interface name to PlatformComponent + private static Map enumMap; + private static synchronized void ensureInitialized() { + if (enumMap == null) { + enumMap = new HashMap<>(); + for (PlatformComponent pc: PlatformComponent.values()) { + // Use String as the key rather than Class to avoid + // causing unnecessary class loading of management interface + enumMap.put(pc.getMXBeanInterfaceName(), pc); + } + } + } + + static boolean isPlatformMXBean(String cn) { + ensureInitialized(); + return enumMap.containsKey(cn); + } + + static + PlatformComponent getPlatformComponent(Class mxbeanInterface) + { + ensureInitialized(); + String cn = mxbeanInterface.getName(); + PlatformComponent pc = enumMap.get(cn); + if (pc != null && pc.getMXBeanInterface() == mxbeanInterface) + return pc; + return null; + } + private static final long serialVersionUID = 6992337162326171013L; }