FileDocCategorySizeDatePackage
ThreadMXBean.javaAPI DocJava SE 6 API31777Tue Jun 10 00:25:38 BST 2008java.lang.management

ThreadMXBean

public interface ThreadMXBean
The management interface for the thread system of the Java virtual machine.

A Java virtual machine has a single instance of the implementation class of this interface. This instance implementing this interface is an MXBean that can be obtained by calling the {@link ManagementFactory#getThreadMXBean} method or from the {@link ManagementFactory#getPlatformMBeanServer platform MBeanServer} method.

The ObjectName for uniquely identifying the MXBean for the thread system within an MBeanServer is:

{@link ManagementFactory#THREAD_MXBEAN_NAME java.lang:type=Threading}

Thread ID

Thread ID is a positive long value returned by calling the {@link java.lang.Thread#getId} method for a thread. The thread ID is unique during its lifetime. When a thread is terminated, this thread ID may be reused.

Some methods in this interface take a thread ID or an array of thread IDs as the input parameter and return per-thread information.

Thread CPU time

A Java virtual machine implementation may support measuring the CPU time for the current thread, for any thread, or for no threads.

The {@link #isThreadCpuTimeSupported} method can be used to determine if a Java virtual machine supports measuring of the CPU time for any thread. The {@link #isCurrentThreadCpuTimeSupported} method can be used to determine if a Java virtual machine supports measuring of the CPU time for the current thread. A Java virtual machine implementation that supports CPU time measurement for any thread will also support that for the current thread.

The CPU time provided by this interface has nanosecond precision but not necessarily nanosecond accuracy.

A Java virtual machine may disable CPU time measurement by default. The {@link #isThreadCpuTimeEnabled} and {@link #setThreadCpuTimeEnabled} methods can be used to test if CPU time measurement is enabled and to enable/disable this support respectively. Enabling thread CPU measurement could be expensive in some Java virtual machine implementations.

Thread Contention Monitoring

Some Java virtual machines may support thread contention monitoring. When thread contention monitoring is enabled, the accumulated elapsed time that the thread has blocked for synchronization or waited for notification will be collected and returned in the ThreadInfo object.

The {@link #isThreadContentionMonitoringSupported} method can be used to determine if a Java virtual machine supports thread contention monitoring. The thread contention monitoring is disabled by default. The {@link #setThreadContentionMonitoringEnabled} method can be used to enable thread contention monitoring.

Synchronization Information and Deadlock Detection

Some Java virtual machines may support monitoring of {@linkplain #isObjectMonitorUsageSupported object monitor usage} and {@linkplain #isSynchronizerUsageSupported ownable synchronizer usage}. The {@link #getThreadInfo(long[], boolean, boolean)} and {@link #dumpAllThreads} methods can be used to obtain the thread stack trace and synchronization information including which {@linkplain LockInfo lock} a thread is blocked to acquire or waiting on and which locks the thread currently owns.

The ThreadMXBean interface provides the {@link #findMonitorDeadlockedThreads} and {@link #findDeadlockedThreads} methods to find deadlocks in the running application.

see
JMX Specification.
see
Ways to Access MXBeans
author
Mandy Chung
version
1.20, 03/08/06
since
1.5

Fields Summary
Constructors Summary
Methods Summary
public java.lang.management.ThreadInfo[]dumpAllThreads(boolean lockedMonitors, boolean lockedSynchronizers)
Returns the thread info for all live threads with stack trace and synchronization information. Some threads included in the returned array may have been terminated when this method returns.

This method returns an array of {@link ThreadInfo} objects as specified in the {@link #getThreadInfo(long[], boolean, boolean)} method.

param
lockedMonitors if true, dump all locked monitors.
param
lockedSynchronizers if true, dump all locked ownable synchronizers.
return
an array of {@link ThreadInfo} for all live threads.
throws
java.lang.SecurityException if a security manager exists and the caller does not have ManagementPermission("monitor").
throws
java.lang.UnsupportedOperationException
  • if lockedMonitors is true but the Java virtual machine does not support monitoring of {@linkplain #isObjectMonitorUsageSupported object monitor usage}; or
  • if lockedSynchronizers is true but the Java virtual machine does not support monitoring of {@linkplain #isSynchronizerUsageSupported ownable synchronizer usage}.
see
#isObjectMonitorUsageSupported
see
#isSynchronizerUsageSupported
since
1.6

public long[]findDeadlockedThreads()
Finds cycles of threads that are in deadlock waiting to acquire object monitors or ownable synchronizers. Threads are deadlocked in a cycle waiting for a lock of these two types if each thread owns one lock while trying to acquire another lock already held by another thread in the cycle.

This method is designed for troubleshooting use, but not for synchronization control. It might be an expensive operation.

return
an array of IDs of the threads that are deadlocked waiting for object monitors or ownable synchronizers, if any; null otherwise.
throws
java.lang.SecurityException if a security manager exists and the caller does not have ManagementPermission("monitor").
throws
java.lang.UnsupportedOperationException if the Java virtual machine does not support monitoriing of ownable synchronizer usage.
see
#isSynchronizerUsageSupported
see
#findMonitorDeadlockedThreads
since
1.6

public long[]findMonitorDeadlockedThreads()
Finds cycles of threads that are in deadlock waiting to acquire object monitors. That is, threads that are blocked waiting to enter a synchronization block or waiting to reenter a synchronization block after an {@link Object#wait Object.wait} call, where each thread owns one monitor while trying to obtain another monitor already held by another thread in a cycle.

More formally, a thread is monitor deadlocked if it is part of a cycle in the relation "is waiting for an object monitor owned by". In the simplest case, thread A is blocked waiting for a monitor owned by thread B, and thread B is blocked waiting for a monitor owned by thread A.

This method is designed for troubleshooting use, but not for synchronization control. It might be an expensive operation.

This method finds deadlocks involving only object monitors. To find deadlocks involving both object monitors and ownable synchronizers, the {@link #findDeadlockedThreads findDeadlockedThreads} method should be used.

return
an array of IDs of the threads that are monitor deadlocked, if any; null otherwise.
throws
java.lang.SecurityException if a security manager exists and the caller does not have ManagementPermission("monitor").
see
#findDeadlockedThreads

public long[]getAllThreadIds()
Returns all live thread IDs. Some threads included in the returned array may have been terminated when this method returns.

return
an array of long, each is a thread ID.
throws
java.lang.SecurityException if a security manager exists and the caller does not have ManagementPermission("monitor").

public longgetCurrentThreadCpuTime()
Returns the total CPU time for the current thread in nanoseconds. The returned value is of nanoseconds precision but not necessarily nanoseconds accuracy. If the implementation distinguishes between user mode time and system mode time, the returned CPU time is the amount of time that the current thread has executed in user mode or system mode.

This is a convenient method for local management use and is equivalent to calling:

{@link #getThreadCpuTime getThreadCpuTime}(Thread.currentThread().getId());

return
the total CPU time for the current thread if CPU time measurement is enabled; -1 otherwise.
throws
java.lang.UnsupportedOperationException if the Java virtual machine does not support CPU time measurement for the current thread.
see
#getCurrentThreadUserTime
see
#isCurrentThreadCpuTimeSupported
see
#isThreadCpuTimeEnabled
see
#setThreadCpuTimeEnabled

public longgetCurrentThreadUserTime()
Returns the CPU time that the current thread has executed in user mode in nanoseconds. The returned value is of nanoseconds precision but not necessarily nanoseconds accuracy.

This is a convenient method for local management use and is equivalent to calling:

{@link #getThreadUserTime getThreadUserTime}(Thread.currentThread().getId());

return
the user-level CPU time for the current thread if CPU time measurement is enabled; -1 otherwise.
throws
java.lang.UnsupportedOperationException if the Java virtual machine does not support CPU time measurement for the current thread.
see
#getCurrentThreadCpuTime
see
#isCurrentThreadCpuTimeSupported
see
#isThreadCpuTimeEnabled
see
#setThreadCpuTimeEnabled

public intgetDaemonThreadCount()
Returns the current number of live daemon threads.

return
the current number of live daemon threads.

public intgetPeakThreadCount()
Returns the peak live thread count since the Java virtual machine started or peak was reset.

return
the peak live thread count.

public intgetThreadCount()
Returns the current number of live threads including both daemon and non-daemon threads.

return
the current number of live threads.

public longgetThreadCpuTime(long id)
Returns the total CPU time for a thread of the specified ID in nanoseconds. The returned value is of nanoseconds precision but not necessarily nanoseconds accuracy. If the implementation distinguishes between user mode time and system mode time, the returned CPU time is the amount of time that the thread has executed in user mode or system mode.

If the thread of the specified ID is not alive or does not exist, this method returns -1. If CPU time measurement is disabled, this method returns -1. A thread is alive if it has been started and has not yet died.

If CPU time measurement is enabled after the thread has started, the Java virtual machine implementation may choose any time up to and including the time that the capability is enabled as the point where CPU time measurement starts.

param
id the thread ID of a thread
return
the total CPU time for a thread of the specified ID if the thread of the specified ID exists, the thread is alive, and CPU time measurement is enabled; -1 otherwise.
throws
IllegalArgumentException if id <= 0 .
throws
java.lang.UnsupportedOperationException if the Java virtual machine does not support CPU time measurement for other threads.
see
#getThreadUserTime
see
#isThreadCpuTimeSupported
see
#isThreadCpuTimeEnabled
see
#setThreadCpuTimeEnabled

public java.lang.management.ThreadInfo[]getThreadInfo(long[] ids, boolean lockedMonitors, boolean lockedSynchronizers)
Returns the thread info for each thread whose ID is in the input array ids, with stack trace and synchronization information.

This method obtains a snapshot of the thread information for each thread including:

  • the entire stack trace,
  • the object monitors currently locked by the thread if lockedMonitors is true, and
  • the ownable synchronizers currently locked by the thread if lockedSynchronizers is true.

This method returns an array of the ThreadInfo objects, each is the thread information about the thread with the same index as in the ids array. If a thread of the given ID is not alive or does not exist, null will be set in the corresponding element in the returned array. A thread is alive if it has been started and has not yet died.

If a thread does not lock any object monitor or lockedMonitors is false, the returned ThreadInfo object will have an empty MonitorInfo array. Similarly, if a thread does not lock any synchronizer or lockedSynchronizers is false, the returned ThreadInfo object will have an empty LockInfo array.

When both lockedMonitors and lockedSynchronizers parameters are false, it is equivalent to calling:

{@link #getThreadInfo(long[], int) getThreadInfo(ids, Integer.MAX_VALUE)}

This method is designed for troubleshooting use, but not for synchronization control. It might be an expensive operation.

MBeanServer access:
The mapped type of ThreadInfo is CompositeData with attributes as specified in the {@link ThreadInfo#from ThreadInfo.from} method.

param
ids an array of thread IDs.
param
lockedMonitors if true, retrieves all locked monitors.
param
lockedSynchronizers if true, retrieves all locked ownable synchronizers.
return
an array of the {@link ThreadInfo} objects, each containing information about a thread whose ID is in the corresponding element of the input array of IDs.
throws
java.lang.SecurityException if a security manager exists and the caller does not have ManagementPermission("monitor").
throws
java.lang.UnsupportedOperationException
  • if lockedMonitors is true but the Java virtual machine does not support monitoring of {@linkplain #isObjectMonitorUsageSupported object monitor usage}; or
  • if lockedSynchronizers is true but the Java virtual machine does not support monitoring of {@linkplain #isSynchronizerUsageSupported ownable synchronizer usage}.
see
#isObjectMonitorUsageSupported
see
#isSynchronizerUsageSupported
since
1.6

public java.lang.management.ThreadInfogetThreadInfo(long id)
Returns the thread info for a thread of the specified id with no stack trace. This method is equivalent to calling:
{@link #getThreadInfo(long, int) getThreadInfo(id, 0);}

This method returns a ThreadInfo object representing the thread information for the thread of the specified ID. The stack trace, locked monitors, and locked synchronizers in the returned ThreadInfo object will be empty. If a thread of the given ID is not alive or does not exist, this method will return null. A thread is alive if it has been started and has not yet died.

MBeanServer access:
The mapped type of ThreadInfo is CompositeData with attributes as specified in the {@link ThreadInfo#from ThreadInfo.from} method.

param
id the thread ID of the thread. Must be positive.
return
a {@link ThreadInfo} object for the thread of the given ID with no stack trace, no locked monitor and no synchronizer info; null if the thread of the given ID is not alive or it does not exist.
throws
IllegalArgumentException if id <= 0.
throws
java.lang.SecurityException if a security manager exists and the caller does not have ManagementPermission("monitor").

public java.lang.management.ThreadInfo[]getThreadInfo(long[] ids)
Returns the thread info for each thread whose ID is in the input array ids with no stack trace. This method is equivalent to calling:
{@link #getThreadInfo(long[], int) getThreadInfo}(ids, 0);

This method returns an array of the ThreadInfo objects. The stack trace, locked monitors, and locked synchronizers in each ThreadInfo object will be empty. If a thread of a given ID is not alive or does not exist, the corresponding element in the returned array will contain null. A thread is alive if it has been started and has not yet died.

MBeanServer access:
The mapped type of ThreadInfo is CompositeData with attributes as specified in the {@link ThreadInfo#from ThreadInfo.from} method.

param
ids an array of thread IDs.
return
an array of the {@link ThreadInfo} objects, each containing information about a thread whose ID is in the corresponding element of the input array of IDs with no stack trace, no locked monitor and no synchronizer info.
throws
IllegalArgumentException if any element in the input array ids is <= 0.
throws
java.lang.SecurityException if a security manager exists and the caller does not have ManagementPermission("monitor").

public java.lang.management.ThreadInfogetThreadInfo(long id, int maxDepth)
Returns a thread info for a thread of the specified id, with stack trace of a specified number of stack trace elements. The maxDepth parameter indicates the maximum number of {@link StackTraceElement} to be retrieved from the stack trace. If maxDepth == Integer.MAX_VALUE, the entire stack trace of the thread will be dumped. If maxDepth == 0, no stack trace of the thread will be dumped. This method does not obtain the locked monitors and locked synchronizers of the thread.

When the Java virtual machine has no stack trace information about a thread or maxDepth == 0, the stack trace in the ThreadInfo object will be an empty array of StackTraceElement.

If a thread of the given ID is not alive or does not exist, this method will return null. A thread is alive if it has been started and has not yet died.

MBeanServer access:
The mapped type of ThreadInfo is CompositeData with attributes as specified in the {@link ThreadInfo#from ThreadInfo.from} method.

param
id the thread ID of the thread. Must be positive.
param
maxDepth the maximum number of entries in the stack trace to be dumped. Integer.MAX_VALUE could be used to request the entire stack to be dumped.
return
a {@link ThreadInfo} of the thread of the given ID with no locked monitor and synchronizer info. null if the thread of the given ID is not alive or it does not exist.
throws
IllegalArgumentException if id <= 0.
throws
IllegalArgumentException if maxDepth is negative.
throws
java.lang.SecurityException if a security manager exists and the caller does not have ManagementPermission("monitor").

public java.lang.management.ThreadInfo[]getThreadInfo(long[] ids, int maxDepth)
Returns the thread info for each thread whose ID is in the input array ids, with stack trace of a specified number of stack trace elements. The maxDepth parameter indicates the maximum number of {@link StackTraceElement} to be retrieved from the stack trace. If maxDepth == Integer.MAX_VALUE, the entire stack trace of the thread will be dumped. If maxDepth == 0, no stack trace of the thread will be dumped. This method does not obtain the locked monitors and locked synchronizers of the threads.

When the Java virtual machine has no stack trace information about a thread or maxDepth == 0, the stack trace in the ThreadInfo object will be an empty array of StackTraceElement.

This method returns an array of the ThreadInfo objects, each is the thread information about the thread with the same index as in the ids array. If a thread of the given ID is not alive or does not exist, null will be set in the corresponding element in the returned array. A thread is alive if it has been started and has not yet died.

MBeanServer access:
The mapped type of ThreadInfo is CompositeData with attributes as specified in the {@link ThreadInfo#from ThreadInfo.from} method.

param
ids an array of thread IDs
param
maxDepth the maximum number of entries in the stack trace to be dumped. Integer.MAX_VALUE could be used to request the entire stack to be dumped.
return
an array of the {@link ThreadInfo} objects, each containing information about a thread whose ID is in the corresponding element of the input array of IDs with no locked monitor and synchronizer info.
throws
IllegalArgumentException if maxDepth is negative.
throws
IllegalArgumentException if any element in the input array ids is <= 0.
throws
java.lang.SecurityException if a security manager exists and the caller does not have ManagementPermission("monitor").

public longgetThreadUserTime(long id)
Returns the CPU time that a thread of the specified ID has executed in user mode in nanoseconds. The returned value is of nanoseconds precision but not necessarily nanoseconds accuracy.

If the thread of the specified ID is not alive or does not exist, this method returns -1. If CPU time measurement is disabled, this method returns -1. A thread is alive if it has been started and has not yet died.

If CPU time measurement is enabled after the thread has started, the Java virtual machine implementation may choose any time up to and including the time that the capability is enabled as the point where CPU time measurement starts.

param
id the thread ID of a thread
return
the user-level CPU time for a thread of the specified ID if the thread of the specified ID exists, the thread is alive, and CPU time measurement is enabled; -1 otherwise.
throws
IllegalArgumentException if id <= 0 .
throws
java.lang.UnsupportedOperationException if the Java virtual machine does not support CPU time measurement for other threads.
see
#getThreadCpuTime
see
#isThreadCpuTimeSupported
see
#isThreadCpuTimeEnabled
see
#setThreadCpuTimeEnabled

public longgetTotalStartedThreadCount()
Returns the total number of threads created and also started since the Java virtual machine started.

return
the total number of threads started.

public booleanisCurrentThreadCpuTimeSupported()
Tests if the Java virtual machine supports CPU time measurement for the current thread. This method returns true if {@link #isThreadCpuTimeSupported} returns true.

return
true if the Java virtual machine supports CPU time measurement for current thread; false otherwise.

public booleanisObjectMonitorUsageSupported()
Tests if the Java virtual machine supports monitoring of object monitor usage.

return
true if the Java virtual machine supports monitoring of object monitor usage; false otherwise.
see
#dumpAllThreads
since
1.6

public booleanisSynchronizerUsageSupported()
Tests if the Java virtual machine supports monitoring of ownable synchronizer usage.

return
true if the Java virtual machine supports monitoring of ownable synchronizer usage; false otherwise.
see
#dumpAllThreads
since
1.6

public booleanisThreadContentionMonitoringEnabled()
Tests if thread contention monitoring is enabled.

return
true if thread contention monitoring is enabled; false otherwise.
throws
java.lang.UnsupportedOperationException if the Java virtual machine does not support thread contention monitoring.
see
#isThreadContentionMonitoringSupported

public booleanisThreadContentionMonitoringSupported()
Tests if the Java virtual machine supports thread contention monitoring.

return
true if the Java virtual machine supports thread contention monitoring; false otherwise.

public booleanisThreadCpuTimeEnabled()
Tests if thread CPU time measurement is enabled.

return
true if thread CPU time measurement is enabled; false otherwise.
throws
java.lang.UnsupportedOperationException if the Java virtual machine does not support CPU time measurement for other threads nor for the current thread.
see
#isThreadCpuTimeSupported
see
#isCurrentThreadCpuTimeSupported

public booleanisThreadCpuTimeSupported()
Tests if the Java virtual machine implementation supports CPU time measurement for any thread. A Java virtual machine implementation that supports CPU time measurement for any thread will also support CPU time measurement for the current thread.

return
true if the Java virtual machine supports CPU time measurement for any thread; false otherwise.

public voidresetPeakThreadCount()
Resets the peak thread count to the current number of live threads.

throws
java.lang.SecurityException if a security manager exists and the caller does not have ManagementPermission("control").
see
#getPeakThreadCount
see
#getThreadCount

public voidsetThreadContentionMonitoringEnabled(boolean enable)
Enables or disables thread contention monitoring. Thread contention monitoring is disabled by default.

param
enable true to enable; false to disable.
throws
java.lang.UnsupportedOperationException if the Java virtual machine does not support thread contention monitoring.
throws
java.lang.SecurityException if a security manager exists and the caller does not have ManagementPermission("control").
see
#isThreadContentionMonitoringSupported

public voidsetThreadCpuTimeEnabled(boolean enable)
Enables or disables thread CPU time measurement. The default is platform dependent.

param
enable true to enable; false to disable.
throws
java.lang.UnsupportedOperationException if the Java virtual machine does not support CPU time measurement for any threads nor for the current thread.
throws
java.lang.SecurityException if a security manager exists and the caller does not have ManagementPermission("control").
see
#isThreadCpuTimeSupported
see
#isCurrentThreadCpuTimeSupported