/* * Copyright (c) 2007, 2013, 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 com.sun.tools.visualvm.application.jvm; import com.sun.tools.visualvm.core.model.Model; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.io.File; import java.io.IOException; import java.util.Properties; import java.util.logging.Logger; /** * This class encapsulates functionality of the target Java application. Use * {@link JvmFactory#getJVMFor(Application )} to get instance of Jvm class. * @author Tomas Hurka */ public abstract class Jvm extends Model { protected static final Logger LOGGER = Logger.getLogger(Jvm.class.getName()); /** * Property name for {@link #isDumpOnOOMEnabled()}. * If property dumpOnOOMEnabled changes its state, property change is fired * with this property name. */ public static final String PROPERTY_DUMP_OOME_ENABLED = "prop_oome"; // NOI18N private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this); /** * Tests if target JVM is JRE 1.4. * @return <CODE>true</CODE> if JVM is JRE 1.4, <CODE>false</CODE> otherwise */ public abstract boolean is14(); /** * Tests if target JVM is JRE 1.5. * @return <CODE>true</CODE> if JVM is JRE 1.5, <CODE>false</CODE> otherwise */ public abstract boolean is15(); /** * Tests if target JVM is JRE 1.6. * @return <CODE>true</CODE> if JVM is JRE 1.6, <CODE>false</CODE> otherwise */ public abstract boolean is16(); /** * Tests if target JVM is JRE 1.7. * @return <CODE>true</CODE> if JVM is JRE 1.7, <CODE>false</CODE> otherwise */ public abstract boolean is17(); /** * Tests if target JVM is JRE 1.8. * @return <CODE>true</CODE> if JVM is JRE 1.8, <CODE>false</CODE> otherwise * * @since VisualVM 1.3.4 */ public boolean is18() { // default implementation for backward compatibility return false; } /** * Tests if target JVM is JRE 1.9. * @return <CODE>true</CODE> if JVM is JRE 1.9, <CODE>false</CODE> otherwise * * @since VisualVM 1.3.8 */ public boolean is19() { // default implementation for backward compatibility return false; } /** * Tests if VisualVM can attach to target JVM via * <a href=http://download.oracle.com/javase/6/docs/technotes/guides/attach/index.html>Attach API</a>. * @return <CODE>true</CODE> if VisualVM can attach to target JVMvia Attach API, <CODE>false</CODE> otherwise */ public abstract boolean isAttachable(); /** * Tests if target JVM supports getting basic JVM informations. This includes * getCommandLine(), getJvmArgs(), getJvmFlags(), getMainClass(), * getVmVersion(), getJavaHome(), getVMInfo(), getVMName() methods. * @return <CODE>true</CODE> if target JVM supports basic JVM information, * <CODE>false</CODE> otherwise */ public abstract boolean isBasicInfoSupported(); /** * Return the command line for the target Java application. * @return Returns the command line of the target Java application. */ public abstract String getCommandLine(); /** * Return the JVM arguments for the target Java application. * @return Returns the arguments passed to the JVM for the target Java application */ public abstract String getJvmArgs(); /** * Return the JVM flags for the target Java application. * @return Returns the flags passed to the JVM for the target Java application */ public abstract String getJvmFlags(); /** * Return the arguments to the main class for the target Java application. * @return Returns the arguments to the main class. */ public abstract String getMainArgs(); /** * Return the main class for the target Java application or the name of the jar file if the application * was started with the <code>-jar</code> option. * @return Returns the main class of the target Java application * or the name of the jar file. */ public abstract String getMainClass(); /** * Returns the VM version for the target Java application. * @return Returns the version of the target Java application */ public abstract String getVmVersion(); /** * Returns the Java version for the target Java application. * @return Returns the Java version of the target Java application * @since 1.3.1 */ public abstract String getJavaVersion(); /** * Returns the java.home property for the target Java application. * "java.home" property specify the directory * into which the JRE was installed. * @return Returns java.home property. */ public abstract String getJavaHome(); /** * Returns the java.vm.info property for the target Java application. * the java.vm.info property (which is reflected in the text displayed by "java -version") * @return Returns java.vm.info property. */ public abstract String getVmInfo(); /** * Returns the java.vm.name property for the target Java application. * java.vm.name property is Java Virtual Machine implementation name. * @return Returns java.vm.name property. */ public abstract String getVmName(); /** * Returns the java.vm.vendor property for the target Java application. * java.vm.vendor property is Java Virtual Machine vendor name. * @return Returns java.vm.vendor property. */ public abstract String getVmVendor(); /** * Tests if target JVM monitoring is supported. If true, JVM fires * {@link MonitoredDataListener#monitoredDataEvent(MonitoredData )} * @return <CODE>true</CODE> if JVM is supports monitoring, * <CODE>false</CODE> otherwise */ public abstract boolean isMonitoringSupported(); /** * Tests if target JVM supports class monitoring. If true, * methods getLoadedClasses(), getSharedLoadedClasses(), * getSharedUnloadedClasses(), getUnloadedClasses() * from {@link MonitoredData} returns meaningful data. * @return <CODE>true</CODE> if JVM supports class monitoring, * <CODE>false</CODE> otherwise */ public abstract boolean isClassMonitoringSupported(); /** * Tests if target JVM supports thread monitoring. If true, * methods getThreadsDaemon(), getThreadsLive(), * getThreadsLivePeak(), getThreadsStarted() * from {@link MonitoredData} returns meaningful data. * @return <CODE>true</CODE> if JVM supports thread monitoring, * <CODE>false</CODE> otherwise */ public abstract boolean isThreadMonitoringSupported(); /** * Tests if target JVM supports thread monitoring. If true, * methods getGenCapacity(), getGenUsed(), getGenMaxCapacity() * from {@link MonitoredData} returns meaningful data. * @return <CODE>true</CODE> if JVM supports memory monitoring, * <CODE>false</CODE> otherwise */ public abstract boolean isMemoryMonitoringSupported(); /** * Tests if target JVM supports process CPU time monitoring. If true, * methods getProcessCpuTime() * from {@link MonitoredData} returns meaningful data. * @return <CODE>true</CODE> if JVM supports process CPU time monitoring, * <CODE>false</CODE> otherwise */ public abstract boolean isCpuMonitoringSupported(); /** * Tests if target JVM supports Garbage collection time monitoring. If true, * methods getCollectionTime() * from {@link MonitoredData} returns meaningful data. * @return <CODE>true</CODE> if JVM supports Garbage collection time monitoring, * <CODE>false</CODE> otherwise */ public abstract boolean isCollectionTimeSupported(); /** * Adds a {@link MonitoredDataListener} to the listener list. * @param l the MonitoredDataListener to be added */ public abstract void addMonitoredDataListener(MonitoredDataListener l); /** * Removes a {@link MonitoredDataListener} to the listener list. * @param l the MonitoredDataListener to be removed */ public abstract void removeMonitoredDataListener(MonitoredDataListener l); /** * Returns the names of Java virtual machine spaces. * * @return Index 0 is the display name for heap, * index 1 is display name for Permanent Generation (PermGen) * * @since VisualVM 1.3.6 */ public abstract String[] getGenName(); /** * Tests if it is possible to obtain system properties from target JVM. * @return <CODE>true</CODE> if JVM supports system properties, * <CODE>false</CODE> otherwise */ public abstract boolean isGetSystemPropertiesSupported(); /** * Returns a map of names and values of all system properties of target JVM. * @return a map of names and values of all system properties. */ public abstract Properties getSystemProperties(); /** * Tests if it is possible to set HeapDumpOnOutOfMemoryError flag in target JVM. * @return <CODE>true</CODE> if JVM supports setting of HeapDumpOnOutOfMemoryError flag, * <CODE>false</CODE> otherwise */ public abstract boolean isDumpOnOOMEnabledSupported(); /** * Gets value of HeapDumpOnOutOfMemoryError flag from target JVM. * @return returns value of HeapDumpOnOutOfMemoryError flag. */ public abstract boolean isDumpOnOOMEnabled(); /** * sets HeapDumpOnOutOfMemoryError flag on target JVM. * @param enabled new value of HeapDumpOnOutOfMemoryError flag */ public abstract void setDumpOnOOMEnabled(boolean enabled); /** * Tests if it is possible to obtain heap dump from target JVM. * @return <CODE>true</CODE> if JVM supports heap dump, * <CODE>false</CODE> otherwise */ public abstract boolean isTakeHeapDumpSupported(); /** * Takes heap dump of target JVM. * @return returns {@link File} where heap dump is stored. * @throws java.io.IOException I/O error */ public abstract File takeHeapDump() throws IOException; /** * Tests if it is possible to obtain thread dump from target JVM. * @return <CODE>true</CODE> if JVM supports thread dump, * <CODE>false</CODE> otherwise */ public abstract boolean isTakeThreadDumpSupported(); /** * Takes thread dump of target JVM. * @throws java.io.IOException i/O error * @return Returns {@link String} of the thread dump from target JVM. */ public abstract File takeThreadDump() throws IOException; /** * Takes heap histogram of target Application. * @since VisualVM 1.3.7 * @return Returns {@link HeapHistogram} of the heap from target Application. */ public HeapHistogram takeHeapHistogram() { // default implementation for backward compatibility return null; } /** * provides access to current values of monitored data in instance of {@link MonitoredData}. * The methods may return <CODE>null</CODE> if the {@link MonitoredData} are not available * or are not supported by particular {@link Jvm} instance. * @since VisualVM 1.2 * @return instance of {@link MonitoredData} with current values of monitored data or * <CODE>null</CODE> if the monitored data cannot be retrieved. */ public abstract MonitoredData getMonitoredData(); /** * Add a PropertyChangeListener to the listener list. * The listener is registered for all properties. * The same listener object may be added more than once, and will be called * as many times as it is added. * If <code>listener</code> is null, no exception is thrown and no action * is taken. * * @param listener The PropertyChangeListener to be added */ public final void addPropertyChangeListener(PropertyChangeListener listener) { changeSupport.addPropertyChangeListener(listener); } /** * Remove a PropertyChangeListener from the listener list. * This removes a PropertyChangeListener that was registered * for all properties. * If <code>listener</code> was added more than once to the same event * source, it will be notified one less time after being removed. * If <code>listener</code> is null, or was never added, no exception is * thrown and no action is taken. * * @param listener The PropertyChangeListener to be removed */ public final void removePropertyChangeListener(PropertyChangeListener listener) { changeSupport.removePropertyChangeListener(listener); } /** * Report a bound property update to any registered listeners. * No event is fired if old and new are equal and non-null. * * @param propertyName The programmatic name of the property * that was changed. * @param oldValue The old value of the property. * @param newValue The new value of the property. */ protected final void firePropertyChange(String propertyName, Object oldValue, Object newValue) { changeSupport.firePropertyChange(propertyName, oldValue, newValue); } }