src/java.management/share/classes/sun/management/VMManagementImpl.java
changeset 47216 71c04702a3d5
parent 42102 3e0a2861efe1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/java.management/share/classes/sun/management/VMManagementImpl.java	Tue Sep 12 19:03:39 2017 +0200
@@ -0,0 +1,283 @@
+/*
+ * Copyright (c) 2003, 2016, 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 sun.management;
+
+import jdk.internal.perf.Perf;
+import sun.management.counter.*;
+import sun.management.counter.perf.*;
+import java.nio.ByteBuffer;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.List;
+import java.util.Arrays;
+import java.util.Collections;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
+/**
+ * Implementation of VMManagement interface that accesses the management
+ * attributes and operations locally within the same Java virtual
+ * machine.
+ */
+class VMManagementImpl implements VMManagement {
+
+    private static String version;
+
+    private static boolean compTimeMonitoringSupport;
+    private static boolean threadContentionMonitoringSupport;
+    private static boolean currentThreadCpuTimeSupport;
+    private static boolean otherThreadCpuTimeSupport;
+    private static boolean objectMonitorUsageSupport;
+    private static boolean synchronizerUsageSupport;
+    private static boolean threadAllocatedMemorySupport;
+    private static boolean gcNotificationSupport;
+    private static boolean remoteDiagnosticCommandsSupport;
+
+
+    static {
+        version = getVersion0();
+        if (version == null) {
+            throw new AssertionError("Invalid Management Version");
+        }
+        initOptionalSupportFields();
+    }
+    private native static String getVersion0();
+    private native static void initOptionalSupportFields();
+
+    // Optional supports
+    public boolean isCompilationTimeMonitoringSupported() {
+        return compTimeMonitoringSupport;
+    }
+
+    public boolean isThreadContentionMonitoringSupported() {
+        return threadContentionMonitoringSupport;
+    }
+
+    public boolean isCurrentThreadCpuTimeSupported() {
+        return currentThreadCpuTimeSupport;
+    }
+
+    public boolean isOtherThreadCpuTimeSupported() {
+        return otherThreadCpuTimeSupport;
+    }
+
+    public boolean isBootClassPathSupported() {
+        return false;
+    }
+
+    public boolean isObjectMonitorUsageSupported() {
+        return objectMonitorUsageSupport;
+    }
+
+    public boolean isSynchronizerUsageSupported() {
+        return synchronizerUsageSupport;
+    }
+
+    public boolean isThreadAllocatedMemorySupported() {
+        return threadAllocatedMemorySupport;
+    }
+
+    public boolean isGcNotificationSupported() {
+        boolean isSupported = true;
+        try {
+            Class.forName("com.sun.management.GarbageCollectorMXBean");
+        } catch (ClassNotFoundException x) {
+            isSupported = false;
+        }
+        return isSupported;
+    }
+
+    public boolean isRemoteDiagnosticCommandsSupported() {
+        return remoteDiagnosticCommandsSupport;
+    }
+
+    public native boolean isThreadContentionMonitoringEnabled();
+    public native boolean isThreadCpuTimeEnabled();
+    public native boolean isThreadAllocatedMemoryEnabled();
+
+    // Class Loading Subsystem
+    public int    getLoadedClassCount() {
+        long count = getTotalClassCount() - getUnloadedClassCount();
+        return (int) count;
+    }
+    public native long getTotalClassCount();
+    public native long getUnloadedClassCount();
+
+    public native boolean getVerboseClass();
+
+    // Memory Subsystem
+    public native boolean getVerboseGC();
+
+    // Runtime Subsystem
+    public String   getManagementVersion() {
+        return version;
+    }
+
+    public String getVmId() {
+        int pid = getProcessId();
+        String hostname = "localhost";
+        try {
+            hostname = InetAddress.getLocalHost().getHostName();
+        } catch (UnknownHostException e) {
+            // ignore
+        }
+
+        return pid + "@" + hostname;
+    }
+    private native int getProcessId();
+
+    public String   getVmName() {
+        return System.getProperty("java.vm.name");
+    }
+
+    public String   getVmVendor() {
+        return System.getProperty("java.vm.vendor");
+    }
+    public String   getVmVersion() {
+        return System.getProperty("java.vm.version");
+    }
+    public String   getVmSpecName()  {
+        return System.getProperty("java.vm.specification.name");
+    }
+    public String   getVmSpecVendor() {
+        return System.getProperty("java.vm.specification.vendor");
+    }
+    public String   getVmSpecVersion() {
+        return System.getProperty("java.vm.specification.version");
+    }
+    public String   getClassPath() {
+        return System.getProperty("java.class.path");
+    }
+    public String   getLibraryPath()  {
+        return System.getProperty("java.library.path");
+    }
+
+    public String   getBootClassPath( ) {
+        throw new UnsupportedOperationException(
+            "Boot class path mechanism is not supported");
+    }
+
+    public long getUptime() {
+        return getUptime0();
+    }
+
+    private List<String> vmArgs = null;
+    public synchronized List<String> getVmArguments() {
+        if (vmArgs == null) {
+            String[] args = getVmArguments0();
+            List<String> l = ((args != null && args.length != 0) ? Arrays.asList(args) :
+                                        Collections.<String>emptyList());
+            vmArgs = Collections.unmodifiableList(l);
+        }
+        return vmArgs;
+    }
+    public native String[] getVmArguments0();
+
+    public native long getStartupTime();
+    private native long getUptime0();
+    public native int getAvailableProcessors();
+
+    // Compilation Subsystem
+    public String   getCompilerName() {
+        String name =  AccessController.doPrivileged(
+            new PrivilegedAction<String>() {
+                public String run() {
+                    return System.getProperty("sun.management.compiler");
+                }
+            });
+        return name;
+    }
+    public native long getTotalCompileTime();
+
+    // Thread Subsystem
+    public native long getTotalThreadCount();
+    public native int  getLiveThreadCount();
+    public native int  getPeakThreadCount();
+    public native int  getDaemonThreadCount();
+
+    // Operating System
+    public String getOsName() {
+        return System.getProperty("os.name");
+    }
+    public String getOsArch() {
+        return System.getProperty("os.arch");
+    }
+    public String getOsVersion() {
+        return System.getProperty("os.version");
+    }
+
+    // Hotspot-specific runtime support
+    public native long getSafepointCount();
+    public native long getTotalSafepointTime();
+    public native long getSafepointSyncTime();
+    public native long getTotalApplicationNonStoppedTime();
+
+    public native long getLoadedClassSize();
+    public native long getUnloadedClassSize();
+    public native long getClassLoadingTime();
+    public native long getMethodDataSize();
+    public native long getInitializedClassCount();
+    public native long getClassInitializationTime();
+    public native long getClassVerificationTime();
+
+    // Performance Counter Support
+    private PerfInstrumentation perfInstr = null;
+    private boolean noPerfData = false;
+
+    private synchronized PerfInstrumentation getPerfInstrumentation() {
+        if (noPerfData || perfInstr != null) {
+             return perfInstr;
+        }
+
+        // construct PerfInstrumentation object
+        Perf perf =  AccessController.doPrivileged(new Perf.GetPerfAction());
+        try {
+            ByteBuffer bb = perf.attach(0, "r");
+            if (bb.capacity() == 0) {
+                noPerfData = true;
+                return null;
+            }
+            perfInstr = new PerfInstrumentation(bb);
+        } catch (IllegalArgumentException e) {
+            // If the shared memory doesn't exist e.g. if -XX:-UsePerfData
+            // was set
+            noPerfData = true;
+        } catch (IOException e) {
+            throw new AssertionError(e);
+        }
+        return perfInstr;
+    }
+
+    public List<Counter> getInternalCounters(String pattern) {
+        PerfInstrumentation perf = getPerfInstrumentation();
+        if (perf != null) {
+            return perf.findByPattern(pattern);
+        } else {
+            return Collections.emptyList();
+        }
+    }
+}