/* * Copyright (c) 2003, 2011, 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 sun.misc.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;import sun.security.action.GetPropertyAction;/** * 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 bootClassPathSupport; private static boolean objectMonitorUsageSupport; private static boolean synchronizerUsageSupport; private static boolean threadAllocatedMemorySupport; private static boolean gcNotificationSupport; 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 bootClassPathSupport; } public boolean isObjectMonitorUsageSupported() { return objectMonitorUsageSupport; } public boolean isSynchronizerUsageSupported() { return synchronizerUsageSupport; } public boolean isThreadAllocatedMemorySupported() { return threadAllocatedMemorySupport; } public boolean isGcNotificationSupported() { return gcNotificationSupport; } 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( ) { PrivilegedAction<String> pa = new GetPropertyAction("sun.boot.class.path"); String result = AccessController.doPrivileged(pa); return result; } 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(); 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(); } }}
/*
* Copyright (c) 2003, 2011, 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 sun.misc.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;
import sun.security.action.GetPropertyAction;
/**
* 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 bootClassPathSupport;
private static boolean objectMonitorUsageSupport;
private static boolean synchronizerUsageSupport;
private static boolean threadAllocatedMemorySupport;
private static boolean gcNotificationSupport;
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 bootClassPathSupport;
}
public boolean isObjectMonitorUsageSupported() {
return objectMonitorUsageSupport;
}
public boolean isSynchronizerUsageSupported() {
return synchronizerUsageSupport;
}
public boolean isThreadAllocatedMemorySupported() {
return threadAllocatedMemorySupport;
}
public boolean isGcNotificationSupported() {
return gcNotificationSupport;
}
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( ) {
PrivilegedAction<String> pa
= new GetPropertyAction("sun.boot.class.path");
String result = AccessController.doPrivileged(pa);
return result;
}
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();
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();
}
}
}