mirror of
https://github.com/openjdk/jdk.git
synced 2026-01-30 04:58:25 +00:00
460 lines
17 KiB
Java
460 lines
17 KiB
Java
/*
|
|
* Copyright (c) 2015, 2020, Oracle and/or its affiliates. All rights reserved.
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* This code is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License version 2 only, as
|
|
* published by the Free Software Foundation. Oracle designates this
|
|
* particular file as subject to the "Classpath" exception as provided
|
|
* by Oracle in the LICENSE file that accompanied this code.
|
|
*
|
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
* version 2 for more details (a copy is included in the LICENSE file that
|
|
* accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU General Public License version
|
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
* or visit www.oracle.com if you need additional information or have any
|
|
* questions.
|
|
*/
|
|
package java.lang.management;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.Collections;
|
|
import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Set;
|
|
import java.util.function.Function;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Stream;
|
|
import javax.management.ObjectName;
|
|
import sun.management.ManagementFactoryHelper;
|
|
import sun.management.spi.PlatformMBeanProvider;
|
|
|
|
class DefaultPlatformMBeanProvider extends PlatformMBeanProvider {
|
|
private final List<PlatformComponent<?>> mxbeanList;
|
|
|
|
DefaultPlatformMBeanProvider() {
|
|
mxbeanList = Collections.unmodifiableList(init());
|
|
}
|
|
|
|
@Override
|
|
public List<PlatformComponent<?>> getPlatformComponentList() {
|
|
return mxbeanList;
|
|
}
|
|
|
|
private List<PlatformComponent<?>> init() {
|
|
ArrayList<PlatformComponent<?>> initMBeanList = new ArrayList<>();
|
|
/**
|
|
* Class loading system of the Java virtual machine.
|
|
*/
|
|
initMBeanList.add(new PlatformComponent<ClassLoadingMXBean>() {
|
|
private final Set<String> classLoadingInterfaceNames =
|
|
Collections.singleton("java.lang.management.ClassLoadingMXBean");
|
|
|
|
@Override
|
|
public Set<Class<? extends ClassLoadingMXBean>> mbeanInterfaces() {
|
|
return Collections.singleton(ClassLoadingMXBean.class);
|
|
}
|
|
|
|
@Override
|
|
public Set<String> mbeanInterfaceNames() {
|
|
return classLoadingInterfaceNames;
|
|
}
|
|
|
|
@Override
|
|
public String getObjectNamePattern() {
|
|
return ManagementFactory.CLASS_LOADING_MXBEAN_NAME;
|
|
}
|
|
|
|
@Override
|
|
public Map<String, ClassLoadingMXBean> nameToMBeanMap() {
|
|
return Collections.singletonMap(
|
|
ManagementFactory.CLASS_LOADING_MXBEAN_NAME,
|
|
ManagementFactoryHelper.getClassLoadingMXBean());
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Compilation system of the Java virtual machine.
|
|
*/
|
|
initMBeanList.add(new PlatformComponent<CompilationMXBean>() {
|
|
private final Set<String> compilationMXBeanInterfaceNames
|
|
= Collections.singleton("java.lang.management.CompilationMXBean");
|
|
|
|
@Override
|
|
public Set<Class<? extends CompilationMXBean>> mbeanInterfaces() {
|
|
return Collections.singleton(CompilationMXBean.class);
|
|
}
|
|
|
|
@Override
|
|
public Set<String> mbeanInterfaceNames() {
|
|
return compilationMXBeanInterfaceNames;
|
|
}
|
|
|
|
@Override
|
|
public String getObjectNamePattern() {
|
|
return ManagementFactory.COMPILATION_MXBEAN_NAME;
|
|
}
|
|
|
|
@Override
|
|
public Map<String, CompilationMXBean> nameToMBeanMap() {
|
|
CompilationMXBean m = ManagementFactoryHelper.getCompilationMXBean();
|
|
if (m == null) {
|
|
return Collections.emptyMap();
|
|
} else {
|
|
return Collections.singletonMap(
|
|
ManagementFactory.COMPILATION_MXBEAN_NAME,
|
|
ManagementFactoryHelper.getCompilationMXBean());
|
|
}
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Memory system of the Java virtual machine.
|
|
*/
|
|
initMBeanList.add(new PlatformComponent<MemoryMXBean>() {
|
|
private final Set<String> memoryMXBeanInterfaceNames
|
|
= Collections.singleton("java.lang.management.MemoryMXBean");
|
|
|
|
@Override
|
|
public Set<Class<? extends MemoryMXBean>> mbeanInterfaces() {
|
|
return Collections.singleton(MemoryMXBean.class);
|
|
}
|
|
|
|
@Override
|
|
public Set<String> mbeanInterfaceNames() {
|
|
return memoryMXBeanInterfaceNames;
|
|
}
|
|
|
|
@Override
|
|
public String getObjectNamePattern() {
|
|
return ManagementFactory.MEMORY_MXBEAN_NAME;
|
|
}
|
|
|
|
@Override
|
|
public Map<String, MemoryMXBean> nameToMBeanMap() {
|
|
return Collections.singletonMap(
|
|
ManagementFactory.MEMORY_MXBEAN_NAME,
|
|
ManagementFactoryHelper.getMemoryMXBean());
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Garbage Collector in the Java virtual machine.
|
|
*/
|
|
initMBeanList.add(new PlatformComponent<MemoryManagerMXBean>() {
|
|
private final Set<String> garbageCollectorMXBeanInterfaceNames
|
|
= Collections.unmodifiableSet(
|
|
Stream.of("java.lang.management.MemoryManagerMXBean",
|
|
"java.lang.management.GarbageCollectorMXBean")
|
|
.collect(Collectors.toSet()));
|
|
@Override
|
|
public Set<Class<? extends MemoryManagerMXBean>> mbeanInterfaces() {
|
|
return Stream.of(MemoryManagerMXBean.class,
|
|
GarbageCollectorMXBean.class).collect(Collectors.toSet());
|
|
}
|
|
|
|
@Override
|
|
public Set<String> mbeanInterfaceNames() {
|
|
return garbageCollectorMXBeanInterfaceNames;
|
|
}
|
|
|
|
@Override
|
|
public String getObjectNamePattern() {
|
|
return ManagementFactory.GARBAGE_COLLECTOR_MXBEAN_DOMAIN_TYPE + ",name=*";
|
|
}
|
|
|
|
@Override
|
|
public boolean isSingleton() {
|
|
return false; // zero or more instances
|
|
}
|
|
|
|
@Override
|
|
public Map<String, MemoryManagerMXBean> nameToMBeanMap() {
|
|
List<GarbageCollectorMXBean> list
|
|
= ManagementFactoryHelper.getGarbageCollectorMXBeans();
|
|
Map<String, MemoryManagerMXBean> map;
|
|
if (list.isEmpty()) {
|
|
map = Collections.emptyMap();
|
|
} else {
|
|
map = new HashMap<>(list.size());
|
|
for (MemoryManagerMXBean gcm : list) {
|
|
map.put(gcm.getObjectName().getCanonicalName(),
|
|
gcm);
|
|
}
|
|
}
|
|
return map;
|
|
}
|
|
|
|
});
|
|
|
|
/**
|
|
* Memory manager in the Java virtual machine.
|
|
*/
|
|
initMBeanList.add(new PlatformComponent<MemoryManagerMXBean>() {
|
|
private final Set<String> memoryManagerMXBeanInterfaceNames
|
|
= Collections.singleton("java.lang.management.MemoryManagerMXBean");
|
|
|
|
@Override
|
|
public Set<Class<? extends MemoryManagerMXBean>> mbeanInterfaces() {
|
|
return Collections.singleton(MemoryManagerMXBean.class);
|
|
}
|
|
|
|
@Override
|
|
public Set<String> mbeanInterfaceNames() {
|
|
return memoryManagerMXBeanInterfaceNames;
|
|
}
|
|
|
|
@Override
|
|
public String getObjectNamePattern() {
|
|
return ManagementFactory.MEMORY_MANAGER_MXBEAN_DOMAIN_TYPE + ",name=*";
|
|
}
|
|
|
|
@Override
|
|
public boolean isSingleton() {
|
|
return false; // zero or more instances
|
|
}
|
|
|
|
@Override
|
|
public Map<String, MemoryManagerMXBean> nameToMBeanMap() {
|
|
List<MemoryManagerMXBean> list
|
|
= ManagementFactoryHelper.getMemoryManagerMXBeans();
|
|
return list.stream()
|
|
.filter(this::isMemoryManager)
|
|
.collect(Collectors.toMap(
|
|
pmo -> pmo.getObjectName().getCanonicalName(), Function.identity()));
|
|
}
|
|
|
|
// ManagementFactoryHelper.getMemoryManagerMXBeans() returns all
|
|
// memory managers - we need to filter out those that do not match
|
|
// the pattern for which we are registered
|
|
private boolean isMemoryManager(MemoryManagerMXBean mbean) {
|
|
final ObjectName name = mbean.getObjectName();
|
|
return ManagementFactory.MEMORY_MANAGER_MXBEAN_DOMAIN_TYPE.startsWith(name.getDomain())
|
|
&& ManagementFactory.MEMORY_MANAGER_MXBEAN_DOMAIN_TYPE.contains(
|
|
"type="+name.getKeyProperty("type"));
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Memory pool in the Java virtual machine.
|
|
*/
|
|
initMBeanList.add(new PlatformComponent<MemoryPoolMXBean>() {
|
|
private final Set<String> memoryPoolMXBeanInterfaceNames
|
|
= Collections.singleton("java.lang.management.MemoryPoolMXBean");
|
|
|
|
@Override
|
|
public Set<Class<? extends MemoryPoolMXBean>> mbeanInterfaces() {
|
|
return Collections.singleton(MemoryPoolMXBean.class);
|
|
}
|
|
|
|
@Override
|
|
public Set<String> mbeanInterfaceNames() {
|
|
return memoryPoolMXBeanInterfaceNames;
|
|
}
|
|
|
|
@Override
|
|
public String getObjectNamePattern() {
|
|
return ManagementFactory.MEMORY_POOL_MXBEAN_DOMAIN_TYPE + ",name=*";
|
|
}
|
|
|
|
@Override
|
|
public boolean isSingleton() {
|
|
return false; // zero or more instances
|
|
}
|
|
|
|
@Override
|
|
public Map<String, MemoryPoolMXBean> nameToMBeanMap() {
|
|
List<MemoryPoolMXBean> list
|
|
= ManagementFactoryHelper.getMemoryPoolMXBeans();
|
|
Map<String, MemoryPoolMXBean> map;
|
|
if (list.isEmpty()) {
|
|
map = Collections.<String, MemoryPoolMXBean>emptyMap();
|
|
} else {
|
|
map = new HashMap<>(list.size());
|
|
for (MemoryPoolMXBean mpm : list) {
|
|
map.put(mpm.getObjectName().getCanonicalName(),
|
|
mpm);
|
|
}
|
|
}
|
|
return map;
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Runtime system of the Java virtual machine.
|
|
*/
|
|
initMBeanList.add(new PlatformComponent<RuntimeMXBean>() {
|
|
private final Set<String> runtimeMXBeanInterfaceNames
|
|
= Collections.singleton("java.lang.management.RuntimeMXBean");
|
|
|
|
@Override
|
|
public Set<Class<? extends RuntimeMXBean>> mbeanInterfaces() {
|
|
return Collections.singleton(RuntimeMXBean.class);
|
|
}
|
|
|
|
@Override
|
|
public Set<String> mbeanInterfaceNames() {
|
|
return runtimeMXBeanInterfaceNames;
|
|
}
|
|
|
|
@Override
|
|
public String getObjectNamePattern() {
|
|
return ManagementFactory.RUNTIME_MXBEAN_NAME;
|
|
}
|
|
|
|
@Override
|
|
public Map<String, RuntimeMXBean> nameToMBeanMap() {
|
|
return Collections.singletonMap(
|
|
ManagementFactory.RUNTIME_MXBEAN_NAME,
|
|
ManagementFactoryHelper.getRuntimeMXBean());
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Threading system of the Java virtual machine.
|
|
*/
|
|
initMBeanList.add(new PlatformComponent<ThreadMXBean>() {
|
|
private final Set<String> threadMXBeanInterfaceNames
|
|
= Collections.singleton("java.lang.management.ThreadMXBean");
|
|
|
|
@Override
|
|
public Set<Class<? extends ThreadMXBean>> mbeanInterfaces() {
|
|
return Collections.singleton(ThreadMXBean.class);
|
|
}
|
|
|
|
@Override
|
|
public Set<String> mbeanInterfaceNames() {
|
|
return threadMXBeanInterfaceNames;
|
|
}
|
|
|
|
@Override
|
|
public String getObjectNamePattern() {
|
|
return ManagementFactory.THREAD_MXBEAN_NAME;
|
|
}
|
|
|
|
@Override
|
|
public Map<String, ThreadMXBean> nameToMBeanMap() {
|
|
return Collections.singletonMap(
|
|
ManagementFactory.THREAD_MXBEAN_NAME,
|
|
ManagementFactoryHelper.getThreadMXBean());
|
|
}
|
|
});
|
|
|
|
if (ManagementFactoryHelper.isPlatformLoggingMXBeanAvailable()) {
|
|
/**
|
|
* Logging facility.
|
|
*/
|
|
initMBeanList.add(new PlatformComponent<PlatformLoggingMXBean>() {
|
|
private final Set<String> platformLoggingMXBeanInterfaceNames
|
|
= Collections.singleton("java.lang.management.PlatformLoggingMXBean");
|
|
|
|
@Override
|
|
public Set<Class<? extends PlatformLoggingMXBean>> mbeanInterfaces() {
|
|
return Collections.singleton(PlatformLoggingMXBean.class);
|
|
}
|
|
|
|
@Override
|
|
public Set<String> mbeanInterfaceNames() {
|
|
return platformLoggingMXBeanInterfaceNames;
|
|
}
|
|
|
|
@Override
|
|
public String getObjectNamePattern() {
|
|
return "java.util.logging:type=Logging";
|
|
}
|
|
|
|
@Override
|
|
public Map<String, PlatformLoggingMXBean> nameToMBeanMap() {
|
|
return Collections.singletonMap(
|
|
"java.util.logging:type=Logging",
|
|
ManagementFactoryHelper.getPlatformLoggingMXBean());
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Buffer pools.
|
|
*/
|
|
initMBeanList.add(new PlatformComponent<BufferPoolMXBean>() {
|
|
private final Set<String> bufferPoolMXBeanInterfaceNames
|
|
= Collections.singleton("java.lang.management.BufferPoolMXBean");
|
|
|
|
@Override
|
|
public Set<Class<? extends BufferPoolMXBean>> mbeanInterfaces() {
|
|
return Collections.singleton(BufferPoolMXBean.class);
|
|
}
|
|
|
|
@Override
|
|
public Set<String> mbeanInterfaceNames() {
|
|
return bufferPoolMXBeanInterfaceNames;
|
|
}
|
|
|
|
@Override
|
|
public String getObjectNamePattern() {
|
|
return "java.nio:type=BufferPool,name=*";
|
|
}
|
|
|
|
@Override
|
|
public boolean isSingleton() {
|
|
return false; // zero or more instances
|
|
}
|
|
|
|
@Override
|
|
public Map<String, BufferPoolMXBean> nameToMBeanMap() {
|
|
List<BufferPoolMXBean> list
|
|
= ManagementFactoryHelper.getBufferPoolMXBeans();
|
|
Map<String, BufferPoolMXBean> map;
|
|
if (list.isEmpty()) {
|
|
map = Collections.<String, BufferPoolMXBean>emptyMap();
|
|
} else {
|
|
map = new HashMap<>(list.size());
|
|
list.forEach(mbean -> map.put(mbean.getObjectName().getCanonicalName(),mbean));
|
|
}
|
|
return map;
|
|
}
|
|
});
|
|
|
|
/**
|
|
* OperatingSystemMXBean
|
|
*/
|
|
initMBeanList.add(new PlatformComponent<OperatingSystemMXBean>() {
|
|
private final Set<String> operatingSystemMXBeanInterfaceNames
|
|
= Collections.singleton("java.lang.management.OperatingSystemMXBean");
|
|
|
|
@Override
|
|
public Set<Class<? extends OperatingSystemMXBean>> mbeanInterfaces() {
|
|
return Collections.singleton(OperatingSystemMXBean.class);
|
|
}
|
|
|
|
@Override
|
|
public Set<String> mbeanInterfaceNames() {
|
|
return operatingSystemMXBeanInterfaceNames;
|
|
}
|
|
|
|
@Override
|
|
public String getObjectNamePattern() {
|
|
return ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME;
|
|
}
|
|
|
|
@Override
|
|
public Map<String, OperatingSystemMXBean> nameToMBeanMap() {
|
|
return Collections.singletonMap(
|
|
ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME,
|
|
ManagementFactoryHelper.getOperatingSystemMXBean());
|
|
}
|
|
|
|
});
|
|
|
|
initMBeanList.trimToSize();
|
|
return initMBeanList;
|
|
}
|
|
}
|