/* * Copyright (c) 2015, 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.unmodifiableSet(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.unmodifiableSet(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.unmodifiableSet(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.unmodifiableSet(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.unmodifiableSet(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.unmodifiableSet(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.unmodifiableSet(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.unmodifiableSet(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.unmodifiableSet(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.stream() .forEach(mbean -> map.put(mbean.getObjectName().getCanonicalName(),mbean)); } return map; } }); /** * OperatingSystemMXBean */ initMBeanList.add(new PlatformComponent<OperatingSystemMXBean>() { private final Set<String> operatingSystemMXBeanInterfaceNames = Collections.unmodifiableSet(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; } }