Path: blob/master/src/java.management/share/classes/java/lang/management/DefaultPlatformMBeanProvider.java
41159 views
/*1* Copyright (c) 2015, 2020, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation. Oracle designates this7* particular file as subject to the "Classpath" exception as provided8* by Oracle in the LICENSE file that accompanied this code.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*/24package java.lang.management;2526import java.util.ArrayList;27import java.util.Collections;28import java.util.HashMap;29import java.util.List;30import java.util.Map;31import java.util.Set;32import java.util.function.Function;33import java.util.stream.Collectors;34import java.util.stream.Stream;35import javax.management.ObjectName;36import sun.management.ManagementFactoryHelper;37import sun.management.spi.PlatformMBeanProvider;3839class DefaultPlatformMBeanProvider extends PlatformMBeanProvider {40private final List<PlatformComponent<?>> mxbeanList;4142DefaultPlatformMBeanProvider() {43mxbeanList = Collections.unmodifiableList(init());44}4546@Override47public List<PlatformComponent<?>> getPlatformComponentList() {48return mxbeanList;49}5051private List<PlatformComponent<?>> init() {52ArrayList<PlatformComponent<?>> initMBeanList = new ArrayList<>();53/**54* Class loading system of the Java virtual machine.55*/56initMBeanList.add(new PlatformComponent<ClassLoadingMXBean>() {57private final Set<String> classLoadingInterfaceNames =58Collections.singleton("java.lang.management.ClassLoadingMXBean");5960@Override61public Set<Class<? extends ClassLoadingMXBean>> mbeanInterfaces() {62return Collections.singleton(ClassLoadingMXBean.class);63}6465@Override66public Set<String> mbeanInterfaceNames() {67return classLoadingInterfaceNames;68}6970@Override71public String getObjectNamePattern() {72return ManagementFactory.CLASS_LOADING_MXBEAN_NAME;73}7475@Override76public Map<String, ClassLoadingMXBean> nameToMBeanMap() {77return Collections.singletonMap(78ManagementFactory.CLASS_LOADING_MXBEAN_NAME,79ManagementFactoryHelper.getClassLoadingMXBean());80}81});8283/**84* Compilation system of the Java virtual machine.85*/86initMBeanList.add(new PlatformComponent<CompilationMXBean>() {87private final Set<String> compilationMXBeanInterfaceNames88= Collections.singleton("java.lang.management.CompilationMXBean");8990@Override91public Set<Class<? extends CompilationMXBean>> mbeanInterfaces() {92return Collections.singleton(CompilationMXBean.class);93}9495@Override96public Set<String> mbeanInterfaceNames() {97return compilationMXBeanInterfaceNames;98}99100@Override101public String getObjectNamePattern() {102return ManagementFactory.COMPILATION_MXBEAN_NAME;103}104105@Override106public Map<String, CompilationMXBean> nameToMBeanMap() {107CompilationMXBean m = ManagementFactoryHelper.getCompilationMXBean();108if (m == null) {109return Collections.emptyMap();110} else {111return Collections.singletonMap(112ManagementFactory.COMPILATION_MXBEAN_NAME,113ManagementFactoryHelper.getCompilationMXBean());114}115}116});117118/**119* Memory system of the Java virtual machine.120*/121initMBeanList.add(new PlatformComponent<MemoryMXBean>() {122private final Set<String> memoryMXBeanInterfaceNames123= Collections.singleton("java.lang.management.MemoryMXBean");124125@Override126public Set<Class<? extends MemoryMXBean>> mbeanInterfaces() {127return Collections.singleton(MemoryMXBean.class);128}129130@Override131public Set<String> mbeanInterfaceNames() {132return memoryMXBeanInterfaceNames;133}134135@Override136public String getObjectNamePattern() {137return ManagementFactory.MEMORY_MXBEAN_NAME;138}139140@Override141public Map<String, MemoryMXBean> nameToMBeanMap() {142return Collections.singletonMap(143ManagementFactory.MEMORY_MXBEAN_NAME,144ManagementFactoryHelper.getMemoryMXBean());145}146});147148/**149* Garbage Collector in the Java virtual machine.150*/151initMBeanList.add(new PlatformComponent<MemoryManagerMXBean>() {152private final Set<String> garbageCollectorMXBeanInterfaceNames153= Collections.unmodifiableSet(154Stream.of("java.lang.management.MemoryManagerMXBean",155"java.lang.management.GarbageCollectorMXBean")156.collect(Collectors.toSet()));157@Override158public Set<Class<? extends MemoryManagerMXBean>> mbeanInterfaces() {159return Stream.of(MemoryManagerMXBean.class,160GarbageCollectorMXBean.class).collect(Collectors.toSet());161}162163@Override164public Set<String> mbeanInterfaceNames() {165return garbageCollectorMXBeanInterfaceNames;166}167168@Override169public String getObjectNamePattern() {170return ManagementFactory.GARBAGE_COLLECTOR_MXBEAN_DOMAIN_TYPE + ",name=*";171}172173@Override174public boolean isSingleton() {175return false; // zero or more instances176}177178@Override179public Map<String, MemoryManagerMXBean> nameToMBeanMap() {180List<GarbageCollectorMXBean> list181= ManagementFactoryHelper.getGarbageCollectorMXBeans();182Map<String, MemoryManagerMXBean> map;183if (list.isEmpty()) {184map = Collections.emptyMap();185} else {186map = new HashMap<>(list.size());187for (MemoryManagerMXBean gcm : list) {188map.put(gcm.getObjectName().getCanonicalName(),189gcm);190}191}192return map;193}194195});196197/**198* Memory manager in the Java virtual machine.199*/200initMBeanList.add(new PlatformComponent<MemoryManagerMXBean>() {201private final Set<String> memoryManagerMXBeanInterfaceNames202= Collections.singleton("java.lang.management.MemoryManagerMXBean");203204@Override205public Set<Class<? extends MemoryManagerMXBean>> mbeanInterfaces() {206return Collections.singleton(MemoryManagerMXBean.class);207}208209@Override210public Set<String> mbeanInterfaceNames() {211return memoryManagerMXBeanInterfaceNames;212}213214@Override215public String getObjectNamePattern() {216return ManagementFactory.MEMORY_MANAGER_MXBEAN_DOMAIN_TYPE + ",name=*";217}218219@Override220public boolean isSingleton() {221return false; // zero or more instances222}223224@Override225public Map<String, MemoryManagerMXBean> nameToMBeanMap() {226List<MemoryManagerMXBean> list227= ManagementFactoryHelper.getMemoryManagerMXBeans();228return list.stream()229.filter(this::isMemoryManager)230.collect(Collectors.toMap(231pmo -> pmo.getObjectName().getCanonicalName(), Function.identity()));232}233234// ManagementFactoryHelper.getMemoryManagerMXBeans() returns all235// memory managers - we need to filter out those that do not match236// the pattern for which we are registered237private boolean isMemoryManager(MemoryManagerMXBean mbean) {238final ObjectName name = mbean.getObjectName();239return ManagementFactory.MEMORY_MANAGER_MXBEAN_DOMAIN_TYPE.startsWith(name.getDomain())240&& ManagementFactory.MEMORY_MANAGER_MXBEAN_DOMAIN_TYPE.contains(241"type="+name.getKeyProperty("type"));242}243});244245/**246* Memory pool in the Java virtual machine.247*/248initMBeanList.add(new PlatformComponent<MemoryPoolMXBean>() {249private final Set<String> memoryPoolMXBeanInterfaceNames250= Collections.singleton("java.lang.management.MemoryPoolMXBean");251252@Override253public Set<Class<? extends MemoryPoolMXBean>> mbeanInterfaces() {254return Collections.singleton(MemoryPoolMXBean.class);255}256257@Override258public Set<String> mbeanInterfaceNames() {259return memoryPoolMXBeanInterfaceNames;260}261262@Override263public String getObjectNamePattern() {264return ManagementFactory.MEMORY_POOL_MXBEAN_DOMAIN_TYPE + ",name=*";265}266267@Override268public boolean isSingleton() {269return false; // zero or more instances270}271272@Override273public Map<String, MemoryPoolMXBean> nameToMBeanMap() {274List<MemoryPoolMXBean> list275= ManagementFactoryHelper.getMemoryPoolMXBeans();276Map<String, MemoryPoolMXBean> map;277if (list.isEmpty()) {278map = Collections.<String, MemoryPoolMXBean>emptyMap();279} else {280map = new HashMap<>(list.size());281for (MemoryPoolMXBean mpm : list) {282map.put(mpm.getObjectName().getCanonicalName(),283mpm);284}285}286return map;287}288});289290/**291* Runtime system of the Java virtual machine.292*/293initMBeanList.add(new PlatformComponent<RuntimeMXBean>() {294private final Set<String> runtimeMXBeanInterfaceNames295= Collections.singleton("java.lang.management.RuntimeMXBean");296297@Override298public Set<Class<? extends RuntimeMXBean>> mbeanInterfaces() {299return Collections.singleton(RuntimeMXBean.class);300}301302@Override303public Set<String> mbeanInterfaceNames() {304return runtimeMXBeanInterfaceNames;305}306307@Override308public String getObjectNamePattern() {309return ManagementFactory.RUNTIME_MXBEAN_NAME;310}311312@Override313public Map<String, RuntimeMXBean> nameToMBeanMap() {314return Collections.singletonMap(315ManagementFactory.RUNTIME_MXBEAN_NAME,316ManagementFactoryHelper.getRuntimeMXBean());317}318});319320/**321* Threading system of the Java virtual machine.322*/323initMBeanList.add(new PlatformComponent<ThreadMXBean>() {324private final Set<String> threadMXBeanInterfaceNames325= Collections.singleton("java.lang.management.ThreadMXBean");326327@Override328public Set<Class<? extends ThreadMXBean>> mbeanInterfaces() {329return Collections.singleton(ThreadMXBean.class);330}331332@Override333public Set<String> mbeanInterfaceNames() {334return threadMXBeanInterfaceNames;335}336337@Override338public String getObjectNamePattern() {339return ManagementFactory.THREAD_MXBEAN_NAME;340}341342@Override343public Map<String, ThreadMXBean> nameToMBeanMap() {344return Collections.singletonMap(345ManagementFactory.THREAD_MXBEAN_NAME,346ManagementFactoryHelper.getThreadMXBean());347}348});349350if (ManagementFactoryHelper.isPlatformLoggingMXBeanAvailable()) {351/**352* Logging facility.353*/354initMBeanList.add(new PlatformComponent<PlatformLoggingMXBean>() {355private final Set<String> platformLoggingMXBeanInterfaceNames356= Collections.singleton("java.lang.management.PlatformLoggingMXBean");357358@Override359public Set<Class<? extends PlatformLoggingMXBean>> mbeanInterfaces() {360return Collections.singleton(PlatformLoggingMXBean.class);361}362363@Override364public Set<String> mbeanInterfaceNames() {365return platformLoggingMXBeanInterfaceNames;366}367368@Override369public String getObjectNamePattern() {370return "java.util.logging:type=Logging";371}372373@Override374public Map<String, PlatformLoggingMXBean> nameToMBeanMap() {375return Collections.singletonMap(376"java.util.logging:type=Logging",377ManagementFactoryHelper.getPlatformLoggingMXBean());378}379});380}381382/**383* Buffer pools.384*/385initMBeanList.add(new PlatformComponent<BufferPoolMXBean>() {386private final Set<String> bufferPoolMXBeanInterfaceNames387= Collections.singleton("java.lang.management.BufferPoolMXBean");388389@Override390public Set<Class<? extends BufferPoolMXBean>> mbeanInterfaces() {391return Collections.singleton(BufferPoolMXBean.class);392}393394@Override395public Set<String> mbeanInterfaceNames() {396return bufferPoolMXBeanInterfaceNames;397}398399@Override400public String getObjectNamePattern() {401return "java.nio:type=BufferPool,name=*";402}403404@Override405public boolean isSingleton() {406return false; // zero or more instances407}408409@Override410public Map<String, BufferPoolMXBean> nameToMBeanMap() {411List<BufferPoolMXBean> list412= ManagementFactoryHelper.getBufferPoolMXBeans();413Map<String, BufferPoolMXBean> map;414if (list.isEmpty()) {415map = Collections.<String, BufferPoolMXBean>emptyMap();416} else {417map = new HashMap<>(list.size());418list.stream()419.forEach(mbean -> map.put(mbean.getObjectName().getCanonicalName(),mbean));420}421return map;422}423});424425/**426* OperatingSystemMXBean427*/428initMBeanList.add(new PlatformComponent<OperatingSystemMXBean>() {429private final Set<String> operatingSystemMXBeanInterfaceNames430= Collections.singleton("java.lang.management.OperatingSystemMXBean");431432@Override433public Set<Class<? extends OperatingSystemMXBean>> mbeanInterfaces() {434return Collections.singleton(OperatingSystemMXBean.class);435}436437@Override438public Set<String> mbeanInterfaceNames() {439return operatingSystemMXBeanInterfaceNames;440}441442@Override443public String getObjectNamePattern() {444return ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME;445}446447@Override448public Map<String, OperatingSystemMXBean> nameToMBeanMap() {449return Collections.singletonMap(450ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME,451ManagementFactoryHelper.getOperatingSystemMXBean());452}453454});455456initMBeanList.trimToSize();457return initMBeanList;458}459}460461462