|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
package java.lang.management; |
|
|
|
import java.util.ArrayList; |
|
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 javax.management.MBeanServerConnection; |
|
import javax.management.ObjectName; |
|
|
|
import com.sun.management.HotSpotDiagnosticMXBean; |
|
import com.sun.management.UnixOperatingSystemMXBean; |
|
|
|
import sun.management.ManagementFactoryHelper; |
|
import sun.management.Util; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
enum PlatformComponent { |
|
|
|
|
|
|
|
*/ |
|
CLASS_LOADING( |
|
"java.lang.management.ClassLoadingMXBean", |
|
"java.lang", "ClassLoading", defaultKeyProperties(), |
|
true, |
|
new MXBeanFetcher<ClassLoadingMXBean>() { |
|
public List<ClassLoadingMXBean> getMXBeans() { |
|
return Collections.singletonList(ManagementFactoryHelper.getClassLoadingMXBean()); |
|
} |
|
}), |
|
|
|
|
|
|
|
*/ |
|
COMPILATION( |
|
"java.lang.management.CompilationMXBean", |
|
"java.lang", "Compilation", defaultKeyProperties(), |
|
true, |
|
new MXBeanFetcher<CompilationMXBean>() { |
|
public List<CompilationMXBean> getMXBeans() { |
|
CompilationMXBean m = ManagementFactoryHelper.getCompilationMXBean(); |
|
if (m == null) { |
|
return Collections.emptyList(); |
|
} else { |
|
return Collections.singletonList(m); |
|
} |
|
} |
|
}), |
|
|
|
|
|
|
|
*/ |
|
MEMORY( |
|
"java.lang.management.MemoryMXBean", |
|
"java.lang", "Memory", defaultKeyProperties(), |
|
true, |
|
new MXBeanFetcher<MemoryMXBean>() { |
|
public List<MemoryMXBean> getMXBeans() { |
|
return Collections.singletonList(ManagementFactoryHelper.getMemoryMXBean()); |
|
} |
|
}), |
|
|
|
|
|
|
|
*/ |
|
GARBAGE_COLLECTOR( |
|
"java.lang.management.GarbageCollectorMXBean", |
|
"java.lang", "GarbageCollector", keyProperties("name"), |
|
false, |
|
new MXBeanFetcher<GarbageCollectorMXBean>() { |
|
public List<GarbageCollectorMXBean> getMXBeans() { |
|
return ManagementFactoryHelper. |
|
getGarbageCollectorMXBeans(); |
|
} |
|
}), |
|
|
|
|
|
|
|
*/ |
|
MEMORY_MANAGER( |
|
"java.lang.management.MemoryManagerMXBean", |
|
"java.lang", "MemoryManager", keyProperties("name"), |
|
false, |
|
new MXBeanFetcher<MemoryManagerMXBean>() { |
|
public List<MemoryManagerMXBean> getMXBeans() { |
|
return ManagementFactoryHelper.getMemoryManagerMXBeans(); |
|
} |
|
}, |
|
GARBAGE_COLLECTOR), |
|
|
|
|
|
|
|
*/ |
|
MEMORY_POOL( |
|
"java.lang.management.MemoryPoolMXBean", |
|
"java.lang", "MemoryPool", keyProperties("name"), |
|
false, |
|
new MXBeanFetcher<MemoryPoolMXBean>() { |
|
public List<MemoryPoolMXBean> getMXBeans() { |
|
return ManagementFactoryHelper.getMemoryPoolMXBeans(); |
|
} |
|
}), |
|
|
|
|
|
|
|
*/ |
|
OPERATING_SYSTEM( |
|
"java.lang.management.OperatingSystemMXBean", |
|
"java.lang", "OperatingSystem", defaultKeyProperties(), |
|
true, |
|
new MXBeanFetcher<OperatingSystemMXBean>() { |
|
public List<OperatingSystemMXBean> getMXBeans() { |
|
return Collections.singletonList(ManagementFactoryHelper.getOperatingSystemMXBean()); |
|
} |
|
}), |
|
|
|
|
|
|
|
*/ |
|
RUNTIME( |
|
"java.lang.management.RuntimeMXBean", |
|
"java.lang", "Runtime", defaultKeyProperties(), |
|
true, |
|
new MXBeanFetcher<RuntimeMXBean>() { |
|
public List<RuntimeMXBean> getMXBeans() { |
|
return Collections.singletonList(ManagementFactoryHelper.getRuntimeMXBean()); |
|
} |
|
}), |
|
|
|
|
|
|
|
*/ |
|
THREADING( |
|
"java.lang.management.ThreadMXBean", |
|
"java.lang", "Threading", defaultKeyProperties(), |
|
true, |
|
new MXBeanFetcher<ThreadMXBean>() { |
|
public List<ThreadMXBean> getMXBeans() { |
|
return Collections.singletonList(ManagementFactoryHelper.getThreadMXBean()); |
|
} |
|
}), |
|
|
|
|
|
|
|
|
|
*/ |
|
LOGGING( |
|
"java.lang.management.PlatformLoggingMXBean", |
|
"java.util.logging", "Logging", defaultKeyProperties(), |
|
true, |
|
new MXBeanFetcher<PlatformLoggingMXBean>() { |
|
public List<PlatformLoggingMXBean> getMXBeans() { |
|
PlatformLoggingMXBean m = ManagementFactoryHelper.getPlatformLoggingMXBean(); |
|
if (m == null) { |
|
return Collections.emptyList(); |
|
} else { |
|
return Collections.singletonList(m); |
|
} |
|
} |
|
}), |
|
|
|
|
|
|
|
*/ |
|
BUFFER_POOL( |
|
"java.lang.management.BufferPoolMXBean", |
|
"java.nio", "BufferPool", keyProperties("name"), |
|
false, |
|
new MXBeanFetcher<BufferPoolMXBean>() { |
|
public List<BufferPoolMXBean> getMXBeans() { |
|
return ManagementFactoryHelper.getBufferPoolMXBeans(); |
|
} |
|
}), |
|
|
|
|
|
// Sun Platform Extension |
|
|
|
|
|
|
|
*/ |
|
SUN_GARBAGE_COLLECTOR( |
|
"com.sun.management.GarbageCollectorMXBean", |
|
"java.lang", "GarbageCollector", keyProperties("name"), |
|
false, |
|
new MXBeanFetcher<com.sun.management.GarbageCollectorMXBean>() { |
|
public List<com.sun.management.GarbageCollectorMXBean> getMXBeans() { |
|
return getGcMXBeanList(com.sun.management.GarbageCollectorMXBean.class); |
|
} |
|
}), |
|
|
|
|
|
|
|
|
|
*/ |
|
SUN_OPERATING_SYSTEM( |
|
"com.sun.management.OperatingSystemMXBean", |
|
"java.lang", "OperatingSystem", defaultKeyProperties(), |
|
true, |
|
new MXBeanFetcher<com.sun.management.OperatingSystemMXBean>() { |
|
public List<com.sun.management.OperatingSystemMXBean> getMXBeans() { |
|
return getOSMXBeanList(com.sun.management.OperatingSystemMXBean.class); |
|
} |
|
}), |
|
|
|
|
|
|
|
*/ |
|
SUN_UNIX_OPERATING_SYSTEM( |
|
"com.sun.management.UnixOperatingSystemMXBean", |
|
"java.lang", "OperatingSystem", defaultKeyProperties(), |
|
true, |
|
new MXBeanFetcher<UnixOperatingSystemMXBean>() { |
|
public List<UnixOperatingSystemMXBean> getMXBeans() { |
|
return getOSMXBeanList(com.sun.management.UnixOperatingSystemMXBean.class); |
|
} |
|
}), |
|
|
|
|
|
|
|
*/ |
|
HOTSPOT_DIAGNOSTIC( |
|
"com.sun.management.HotSpotDiagnosticMXBean", |
|
"com.sun.management", "HotSpotDiagnostic", defaultKeyProperties(), |
|
true, |
|
new MXBeanFetcher<HotSpotDiagnosticMXBean>() { |
|
public List<HotSpotDiagnosticMXBean> getMXBeans() { |
|
return Collections.singletonList(ManagementFactoryHelper.getDiagnosticMXBean()); |
|
} |
|
}); |
|
|
|
|
|
|
|
|
|
*/ |
|
interface MXBeanFetcher<T extends PlatformManagedObject> { |
|
public List<T> getMXBeans(); |
|
} |
|
|
|
|
|
|
|
*/ |
|
private static <T extends GarbageCollectorMXBean> |
|
List<T> getGcMXBeanList(Class<T> gcMXBeanIntf) { |
|
List<GarbageCollectorMXBean> list = |
|
ManagementFactoryHelper.getGarbageCollectorMXBeans(); |
|
List<T> result = new ArrayList<>(list.size()); |
|
for (GarbageCollectorMXBean m : list) { |
|
if (gcMXBeanIntf.isInstance(m)) { |
|
result.add(gcMXBeanIntf.cast(m)); |
|
} |
|
} |
|
return result; |
|
} |
|
|
|
|
|
|
|
*/ |
|
private static <T extends OperatingSystemMXBean> |
|
List<T> getOSMXBeanList(Class<T> osMXBeanIntf) { |
|
OperatingSystemMXBean m = |
|
ManagementFactoryHelper.getOperatingSystemMXBean(); |
|
if (osMXBeanIntf.isInstance(m)) { |
|
return Collections.singletonList(osMXBeanIntf.cast(m)); |
|
} else { |
|
return Collections.emptyList(); |
|
} |
|
} |
|
|
|
private final String mxbeanInterfaceName; |
|
private final String domain; |
|
private final String type; |
|
private final Set<String> keyProperties; |
|
private final MXBeanFetcher<?> fetcher; |
|
private final PlatformComponent[] subComponents; |
|
private final boolean singleton; |
|
|
|
private PlatformComponent(String intfName, |
|
String domain, String type, |
|
Set<String> keyProperties, |
|
boolean singleton, |
|
MXBeanFetcher<?> fetcher, |
|
PlatformComponent... subComponents) { |
|
this.mxbeanInterfaceName = intfName; |
|
this.domain = domain; |
|
this.type = type; |
|
this.keyProperties = keyProperties; |
|
this.singleton = singleton; |
|
this.fetcher = fetcher; |
|
this.subComponents = subComponents; |
|
} |
|
|
|
private static Set<String> defaultKeyProps; |
|
private static Set<String> defaultKeyProperties() { |
|
if (defaultKeyProps == null) { |
|
defaultKeyProps = Collections.singleton("type"); |
|
} |
|
return defaultKeyProps; |
|
} |
|
|
|
private static Set<String> keyProperties(String... keyNames) { |
|
Set<String> set = new HashSet<>(); |
|
set.add("type"); |
|
for (String s : keyNames) { |
|
set.add(s); |
|
} |
|
return set; |
|
} |
|
|
|
boolean isSingleton() { |
|
return singleton; |
|
} |
|
|
|
String getMXBeanInterfaceName() { |
|
return mxbeanInterfaceName; |
|
} |
|
|
|
@SuppressWarnings("unchecked") |
|
Class<? extends PlatformManagedObject> getMXBeanInterface() { |
|
try { |
|
|
|
return (Class<? extends PlatformManagedObject>) |
|
Class.forName(mxbeanInterfaceName, false, |
|
PlatformManagedObject.class.getClassLoader()); |
|
} catch (ClassNotFoundException x) { |
|
throw new AssertionError(x); |
|
} |
|
} |
|
|
|
@SuppressWarnings("unchecked") |
|
<T extends PlatformManagedObject> |
|
List<T> getMXBeans(Class<T> mxbeanInterface) |
|
{ |
|
return (List<T>) fetcher.getMXBeans(); |
|
} |
|
|
|
<T extends PlatformManagedObject> T getSingletonMXBean(Class<T> mxbeanInterface) |
|
{ |
|
if (!singleton) |
|
throw new IllegalArgumentException(mxbeanInterfaceName + |
|
" can have zero or more than one instances"); |
|
|
|
List<T> list = getMXBeans(mxbeanInterface); |
|
assert list.size() == 1; |
|
return list.isEmpty() ? null : list.get(0); |
|
} |
|
|
|
<T extends PlatformManagedObject> |
|
T getSingletonMXBean(MBeanServerConnection mbs, Class<T> mxbeanInterface) |
|
throws java.io.IOException |
|
{ |
|
if (!singleton) |
|
throw new IllegalArgumentException(mxbeanInterfaceName + |
|
" can have zero or more than one instances"); |
|
|
|
|
|
assert keyProperties.size() == 1; |
|
String on = domain + ":type=" + type; |
|
return ManagementFactory.newPlatformMXBeanProxy(mbs, |
|
on, |
|
mxbeanInterface); |
|
} |
|
|
|
<T extends PlatformManagedObject> |
|
List<T> getMXBeans(MBeanServerConnection mbs, Class<T> mxbeanInterface) |
|
throws java.io.IOException |
|
{ |
|
List<T> result = new ArrayList<>(); |
|
for (ObjectName on : getObjectNames(mbs)) { |
|
result.add(ManagementFactory. |
|
newPlatformMXBeanProxy(mbs, |
|
on.getCanonicalName(), |
|
mxbeanInterface) |
|
); |
|
} |
|
return result; |
|
} |
|
|
|
private Set<ObjectName> getObjectNames(MBeanServerConnection mbs) |
|
throws java.io.IOException |
|
{ |
|
String domainAndType = domain + ":type=" + type; |
|
if (keyProperties.size() > 1) { |
|
|
|
domainAndType += ",*"; |
|
} |
|
ObjectName on = Util.newObjectName(domainAndType); |
|
Set<ObjectName> set = mbs.queryNames(on, null); |
|
for (PlatformComponent pc : subComponents) { |
|
set.addAll(pc.getObjectNames(mbs)); |
|
} |
|
return set; |
|
} |
|
|
|
|
|
private static Map<String, PlatformComponent> 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 |
|
|
|
enumMap.put(pc.getMXBeanInterfaceName(), pc); |
|
} |
|
} |
|
} |
|
|
|
static boolean isPlatformMXBean(String cn) { |
|
ensureInitialized(); |
|
return enumMap.containsKey(cn); |
|
} |
|
|
|
static <T extends PlatformManagedObject> |
|
PlatformComponent getPlatformComponent(Class<T> 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; |
|
} |