| /* ThreadMXBean.java - Interface for a thread bean | |
| Copyright (C) 2006 Free Software Foundation | |
| This file is part of GNU Classpath. | |
| GNU Classpath is free software; you can redistribute it and/or modify | |
| it under the terms of the GNU General Public License as published by | |
| the Free Software Foundation; either version 2, or (at your option) | |
| any later version. | |
| GNU Classpath 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 for more details. | |
| You should have received a copy of the GNU General Public License | |
| along with GNU Classpath; see the file COPYING. If not, write to the | |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | |
| 02110-1301 USA. | |
| Linking this library statically or dynamically with other modules is | |
| making a combined work based on this library. Thus, the terms and | |
| conditions of the GNU General Public License cover the whole | |
| combination. | |
| As a special exception, the copyright holders of this library give you | |
| permission to link this library with independent modules to produce an | |
| executable, regardless of the license terms of these independent | |
| modules, and to copy and distribute the resulting executable under | |
| terms of your choice, provided that you also meet, for each linked | |
| independent module, the terms and conditions of the license of that | |
| module. An independent module is a module which is not derived from | |
| or based on this library. If you modify this library, you may extend | |
| this exception to your version of the library, but you are not | |
| obligated to do so. If you do not wish to do so, delete this | |
| exception statement from your version. */ | |
| package java.lang.management; | |
| /** | |
| * <p> | |
| * Provides access to information about the threads | |
| * of the virtual machine. An instance of this bean is | |
| * obtained by calling | |
| * {@link ManagementFactory#getThreadMXBean()}. | |
| * </p> | |
| * <p> | |
| * Each thread within the virtual machine is given an | |
| * identifier, which is guaranteed to be unique to a | |
| * particular thread over its lifetime (after which it | |
| * may be reused). The identifier for a thread may be | |
| * obtained by calling {@link java.lang.Thread#getId()}. | |
| * This identifier is used within implementations of this | |
| * interface to obtain information about a particular thread | |
| * (or series of threads, in the case of an array of identifiers). | |
| * </p> | |
| * <p> | |
| * This bean supports some optional behaviour, which all | |
| * virtual machines may not choose to implement. Specifically, | |
| * this includes the monitoring of the CPU time used by a | |
| * thread, and the monitoring of thread contention. The former | |
| * is further subdivided into the monitoring of either just | |
| * the current thread or all threads. The methods | |
| * {@link #isThreadCpuTimeSupported()}, | |
| * {@link #isCurrentThreadCpuTimeSupported()} and | |
| * {@link #isThreadContentionMonitoringSupported()} may be | |
| * used to determine whether or not this functionality is | |
| * supported. | |
| * </p> | |
| * <p> | |
| * Furthermore, both these facilities may be disabled. | |
| * In fact, thread contention monitoring is disabled by | |
| * default, and must be explictly turned on by calling | |
| * the {@link #setThreadContentionMonitoringEnabled(boolean)} | |
| * method. | |
| * </p> | |
| * | |
| * @author Andrew John Hughes (gnu_andrew@member.fsf.org) | |
| * @since 1.5 | |
| */ | |
| public interface ThreadMXBean | |
| { | |
| /** | |
| * <p> | |
| * This method obtains a list of threads which are deadlocked | |
| * waiting to obtain monitor ownership. On entering a synchronized | |
| * method of an object, or re-entering it after returning from an | |
| * {@link java.lang.Object#wait()} call, a thread obtains ownership | |
| * of the object's monitor. | |
| * </p> | |
| * <p> | |
| * Deadlocks can occur in this situation if one or more threads end up | |
| * waiting for a monitor, P, while also retaining ownership of a monitor, | |
| * Q, required by the thread that currently owns P. To give a simple | |
| * example, imagine thread A calls a synchronized method, R, obtaining the | |
| * monitor, P. It then sleeps within that method, allowing thread B | |
| * to run, but still retaining ownership of P. B calls another | |
| * synchronized method, S, which causes it to obtain the monitor, Q, | |
| * of a different object. While in that method, it then wants to | |
| * call the original synchronized method, R, called by A. Doing so | |
| * requires ownership of P, which is still held by A. Hence, it | |
| * becomes blocked. | |
| * </p> | |
| * <p> | |
| * A then finishes its sleep, becomes runnable, and is then allowed | |
| * to run, being the only eligible thread in this scenario. A tries | |
| * to call the synchronized method, S. It also gets blocked, because | |
| * B still holds the monitor, Q. Hence, the two threads, A and B, | |
| * are deadlocked, as neither can give up its monitor without first | |
| * obtaining the monitor held by the other thread. | |
| * </p> | |
| * <p> | |
| * Calling this method in this scenario would return the thread IDs | |
| * of A and B. Note that this method is not designed for controlling | |
| * synchronization, but for troubleshooting problems which cause such | |
| * deadlocks; it may be prohibitively expensive to use in normal | |
| * operation. | |
| * </p> | |
| * | |
| * @return an array of thread identifiers, corresponding to threads | |
| * which are currently in a deadlocked situation. | |
| * @throws SecurityException if a security manager exists and | |
| * denies ManagementPermission("monitor"). | |
| */ | |
| long[] findMonitorDeadlockedThreads(); | |
| /** | |
| * Returns all live thread identifiers at the time of initial | |
| * execution. Some thread identifiers in the returned array | |
| * may refer to terminated threads, if this occurs during the | |
| * lifetime of this method. | |
| * | |
| * @return an array of thread identifiers, corresponding to | |
| * current live threads. | |
| * @throws SecurityException if a security manager exists and | |
| * denies ManagementPermission("monitor"). | |
| */ | |
| long[] getAllThreadIds(); | |
| /** | |
| * <p> | |
| * Returns the total number of nanoseconds of CPU time | |
| * the current thread has used. This is equivalent to calling | |
| * <code>{@link #getThreadCpuTime()}(Thread.currentThread.getId())</code>. | |
| * </p> | |
| * <p> | |
| * Note that the value is only nanosecond-precise, and not accurate; there | |
| * is no guarantee that the difference between two values is really a | |
| * nanosecond. Also, the value is prone to overflow if the offset | |
| * exceeds 2^63. The use of this method depends on virtual machine | |
| * support for measurement of the CPU time of the current thread, | |
| * and on this functionality being enabled. | |
| * </p> | |
| * | |
| * @return the total number of nanoseconds of CPU time the current | |
| * thread has used, or -1 if CPU time monitoring is disabled. | |
| * @throws UnsupportedOperationException if CPU time monitoring is not | |
| * supported. | |
| * @see #getCurrentThreadUserTime() | |
| * @see #isCurrentThreadCpuTimeSupported() | |
| * @see #isThreadCpuTimeEnabled() | |
| * @see #setThreadCpuTimeEnabled(boolean) | |
| */ | |
| long getCurrentThreadCpuTime(); | |
| /** | |
| * <p> | |
| * Returns the total number of nanoseconds of CPU time | |
| * the current thread has executed in user mode. This is | |
| * equivalent to calling | |
| * <code>{@link #getThreadUserTime()}(Thread.currentThread.getId())</code>. | |
| * </p> | |
| * <p> | |
| * Note that the value is only nanosecond-precise, and not accurate; there | |
| * is no guarantee that the difference between two values is really a | |
| * nanosecond. Also, the value is prone to overflow if the offset | |
| * exceeds 2^63. The use of this method depends on virtual machine | |
| * support for measurement of the CPU time of the current thread, | |
| * and on this functionality being enabled. | |
| * </p> | |
| * | |
| * @return the total number of nanoseconds of CPU time the current | |
| * thread has executed in user mode, or -1 if CPU time | |
| * monitoring is disabled. | |
| * @throws UnsupportedOperationException if CPU time monitoring is not | |
| * supported. | |
| * @see #getCurrentThreadCpuTime() | |
| * @see #isCurrentThreadCpuTimeSupported() | |
| * @see #isThreadCpuTimeEnabled() | |
| * @see #setThreadCpuTimeEnabled(boolean) | |
| */ | |
| long getCurrentThreadUserTime(); | |
| /** | |
| * Returns the number of live daemon threads. | |
| * | |
| * @return the number of live daemon threads. | |
| */ | |
| int getDaemonThreadCount(); | |
| /** | |
| * Returns the peak number of live threads since | |
| * the virtual machine was started or the count | |
| * reset using {@link #resetPeakThreadCount()}. | |
| * | |
| * @return the peak live thread count. | |
| * @see #resetPeakThreadCount() | |
| */ | |
| int getPeakThreadCount(); | |
| /** | |
| * Returns the number of live threads, including | |
| * both daemon threads and non-daemon threads. | |
| * | |
| * @return the current number of live threads. | |
| */ | |
| int getThreadCount(); | |
| /** | |
| * <p> | |
| * Returns the total number of nanoseconds of CPU time | |
| * the specified thread has used. | |
| * </p> | |
| * <p> | |
| * Note that the value is only nanosecond-precise, and not accurate; there | |
| * is no guarantee that the difference between two values is really a | |
| * nanosecond. Also, the value is prone to overflow if the offset | |
| * exceeds 2^63. The use of this method depends on virtual machine | |
| * support for measurement of the CPU time of the current thread, | |
| * and on this functionality being enabled. | |
| * </p> | |
| * | |
| * @param id the thread identifier of the thread whose CPU time is being | |
| * monitored. | |
| * @return the total number of nanoseconds of CPU time the specified | |
| * thread has used, or -1 if CPU time monitoring is disabled. | |
| * @throws IllegalArgumentException if <code>id</code> <= 0. | |
| * @throws UnsupportedOperationException if CPU time monitoring is not | |
| * supported. | |
| * @see #getThreadUserTime(long) | |
| * @see #isThreadCpuTimeSupported() | |
| * @see #isThreadCpuTimeEnabled() | |
| * @see #setThreadCpuTimeEnabled(boolean) | |
| */ | |
| long getThreadCpuTime(long id); | |
| /** | |
| * Returns information on the specified thread without any | |
| * stack trace information. This is equivalent to | |
| * <code>{@link #getThreadInfo}(id, 0)</code>. If the | |
| * identifier specifies a thread which is either non-existant | |
| * or not alive, then the method returns <code>null</code>. | |
| * | |
| * @param id the identifier of the thread to return information | |
| * on. | |
| * @return a {@link ThreadInfo} object pertaining to the specified | |
| * thread, or <code>null</code> if the identifier specifies | |
| * a thread that doesn't exist or is not alive. | |
| * @throws IllegalArgumentException if <code>id</code> <= 0. | |
| * @throws SecurityException if a security manager exists and | |
| * denies ManagementPermission("monitor"). | |
| */ | |
| ThreadInfo getThreadInfo(long id); | |
| /** | |
| * Returns information on the specified threads without any | |
| * stack trace information. This is equivalent to | |
| * <code>{@link #getThreadInfo}(ids, 0)</code>. If an | |
| * identifier specifies a thread which is either non-existant | |
| * or not alive, then the corresponding element in the returned | |
| * array is <code>null</code>. | |
| * | |
| * @param ids an array of thread identifiers to return information | |
| * on. | |
| * @return an array of {@link ThreadInfo} objects matching the | |
| * specified threads. The corresponding element is | |
| * <code>null</code> if the identifier specifies | |
| * a thread that doesn't exist or is not alive. | |
| * @throws IllegalArgumentException if an identifier in the array is | |
| * <= 0. | |
| * @throws SecurityException if a security manager exists and | |
| * denies ManagementPermission("monitor"). | |
| */ | |
| ThreadInfo[] getThreadInfo(long[] ids); | |
| /** | |
| * Returns information on the specified thread with | |
| * stack trace information to the supplied depth. If the | |
| * identifier specifies a thread which is either non-existant | |
| * or not alive, then the method returns <code>null</code>. | |
| * A maximum depth of 0 corresponds to an empty stack trace | |
| * (an empty array is returned by the appropriate | |
| * {@link ThreadInfo} method). A maximum depth of | |
| * <code>Integer.MAX_VALUE</code> returns the full stack trace. | |
| * | |
| * @param id the identifier of the thread to return information | |
| * on. | |
| * @param maxDepth the maximum depth of the stack trace. | |
| * Values of 0 or <code>Integer.MAX_VALUE</code> | |
| * correspond to an empty and full stack trace | |
| * respectively. | |
| * @return a {@link ThreadInfo} object pertaining to the specified | |
| * thread, or <code>null</code> if the identifier specifies | |
| * a thread that doesn't exist or is not alive. | |
| * @throws IllegalArgumentException if <code>id</code> <= 0. | |
| * @throws IllegalArgumentException if <code>maxDepth</code> < 0. | |
| * @throws SecurityException if a security manager exists and | |
| * denies ManagementPermission("monitor"). | |
| */ | |
| ThreadInfo getThreadInfo(long id, int maxDepth); | |
| /** | |
| * Returns information on the specified threads with | |
| * stack trace information to the supplied depth. If an | |
| * identifier specifies a thread which is either non-existant | |
| * or not alive, then the corresponding element in the returned | |
| * array is <code>null</code>. A maximum depth of 0 corresponds | |
| * to an empty stack trace (an empty array is returned by the | |
| * appropriate {@link ThreadInfo} method). A maximum depth of | |
| * <code>Integer.MAX_VALUE</code> returns the full stack trace. | |
| * | |
| * @param ids an array of thread identifiers to return information | |
| * on. | |
| * @param maxDepth the maximum depth of the stack trace. | |
| * Values of 0 or <code>Integer.MAX_VALUE</code> | |
| * correspond to an empty and full stack trace | |
| * respectively. | |
| * @return an array of {@link ThreadInfo} objects matching the | |
| * specified threads. The corresponding element is | |
| * <code>null</code> if the identifier specifies | |
| * a thread that doesn't exist or is not alive. | |
| * @throws IllegalArgumentException if an identifier in the array is | |
| * <= 0. | |
| * @throws IllegalArgumentException if <code>maxDepth</code> < 0. | |
| * @throws SecurityException if a security manager exists and | |
| * denies ManagementPermission("monitor"). | |
| */ | |
| ThreadInfo[] getThreadInfo(long[] ids, int maxDepth); | |
| /** | |
| * <p> | |
| * Returns the total number of nanoseconds of CPU time | |
| * the specified thread has executed in user mode. | |
| * </p> | |
| * <p> | |
| * Note that the value is only nanosecond-precise, and not accurate; there | |
| * is no guarantee that the difference between two values is really a | |
| * nanosecond. Also, the value is prone to overflow if the offset | |
| * exceeds 2^63. The use of this method depends on virtual machine | |
| * support for measurement of the CPU time of the current thread, | |
| * and on this functionality being enabled. | |
| * </p> | |
| * | |
| * @param id the thread identifier of the thread whose CPU time is being | |
| * monitored. | |
| * @return the total number of nanoseconds of CPU time the specified | |
| * thread has executed in user mode, or -1 if CPU time monitoring | |
| * is disabled. | |
| * @throws IllegalArgumentException if <code>id</code> <= 0. | |
| * @throws UnsupportedOperationException if CPU time monitoring is not | |
| * supported. | |
| * @see #getThreadCpuTime(long) | |
| * @see #isThreadCpuTimeSupported() | |
| * @see #isThreadCpuTimeEnabled() | |
| * @see #setThreadCpuTimeEnabled(boolean) | |
| */ | |
| long getThreadUserTime(long id); | |
| /** | |
| * Returns the total number of threads that have been | |
| * created and started during the lifetime of the virtual | |
| * machine. | |
| * | |
| * @return the total number of started threads. | |
| */ | |
| long getTotalStartedThreadCount(); | |
| /** | |
| * Returns true if the virtual machine supports the monitoring | |
| * of the CPU time used by the current thread. This is implied | |
| * by {@link isThreadCpuTimeSupported()} returning true. | |
| * | |
| * @return true if monitoring of the CPU time used by the current | |
| * thread is supported by the virtual machine. | |
| * @see #isThreadCpuTimeEnabled() | |
| * @see #isThreadCpuTimeSupported() | |
| * @see #setThreadCpuTimeEnabled(boolean) | |
| */ | |
| boolean isCurrentThreadCpuTimeSupported(); | |
| /** | |
| * Returns true if thread contention monitoring is currently | |
| * enabled. | |
| * | |
| * @return true if thread contention monitoring is enabled. | |
| * @throws UnsupportedOperationException if the virtual | |
| * machine does not | |
| * support contention | |
| * monitoring. | |
| * @see #isThreadContentionMonitoringSupported() | |
| * @see #setThreadContentionMonitoringEnabled(boolean) | |
| */ | |
| boolean isThreadContentionMonitoringEnabled(); | |
| /** | |
| * Returns true if thread contention monitoring is supported | |
| * by the virtual machine. | |
| * | |
| * @return true if thread contention monitoring is supported | |
| * by the virtual machine. | |
| * @see #isThreadContentionMonitoringEnabled() | |
| * @see #setThreadContentionMonitoringEnabled(boolean) | |
| */ | |
| boolean isThreadContentionMonitoringSupported(); | |
| /** | |
| * Returns true if monitoring of the CPU time used by a thread | |
| * is currently enabled. | |
| * | |
| * @return true if thread CPU time monitoring is enabled. | |
| * @throws UnsupportedOperationException if the virtual | |
| * machine does not | |
| * support CPU time | |
| * monitoring. | |
| * @see #isCurrentThreadCpuTimeSupported() | |
| * @see #isThreadCpuTimeSupported() | |
| * @see #setThreadCpuTimeEnabled(boolean) | |
| */ | |
| boolean isThreadCpuTimeEnabled(); | |
| /** | |
| * Returns true if the virtual machine supports the monitoring | |
| * of the CPU time used by all threads. This implies | |
| * that {@link isCurrentThreadCpuTimeSupported()} returns true. | |
| * | |
| * @return true if monitoring of the CPU time used by the current | |
| * thread is supported by the virtual machine. | |
| * @see #isCurrentThreadCpuTimeSupported() | |
| * @see #isThreadCpuTimeEnabled() | |
| * @see #setThreadCpuTimeEnabled(boolean) | |
| */ | |
| boolean isThreadCpuTimeSupported(); | |
| /** | |
| * Resets the peak live thread count to the | |
| * current number of live threads, as returned | |
| * by {@link #getThreadCount()}. | |
| * | |
| * @see #getPeakThreadCount() | |
| * @see #getThreadCount() | |
| * @throws SecurityException if a security manager exists and | |
| * denies ManagementPermission("control"). | |
| */ | |
| void resetPeakThreadCount(); | |
| /** | |
| * Toggles the monitoring of thread contention. Thread | |
| * contention monitoring is disabled by default. Each | |
| * time contention monitoring is re-enabled, the times | |
| * it maintains are reset. | |
| * | |
| * @param enable true if monitoring should be enabled, | |
| * false if it should be disabled. | |
| * @throws UnsupportedOperationException if the virtual | |
| * machine does not | |
| * support contention | |
| * monitoring. | |
| * @throws SecurityException if a security manager exists and | |
| * denies ManagementPermission("control"). | |
| * @see #isThreadContentionMonitoringEnabled() | |
| * @see #isThreadContentionMonitoringSupported() | |
| */ | |
| void setThreadContentionMonitoringEnabled(boolean enable); | |
| /** | |
| * Toggles the monitoring of CPU time used by threads. The | |
| * initial setting is dependent on the underlying virtual | |
| * machine. On enabling CPU time monitoring, the virtual | |
| * machine may take any value up to and including the current | |
| * time as the start time for monitoring. | |
| * | |
| * @param enable true if monitoring should be enabled, | |
| * false if it should be disabled. | |
| * @throws UnsupportedOperationException if the virtual | |
| * machine does not | |
| * support CPU time | |
| * monitoring. | |
| * @throws SecurityException if a security manager exists and | |
| * denies ManagementPermission("control"). | |
| * @see #isCurrentThreadCpuTimeSupported() | |
| * @see #isThreadCpuTimeEnabled() | |
| * @see #isThreadCpuTimeSupported() | |
| */ | |
| void setThreadCpuTimeEnabled(boolean enable); | |
| } |