public interface ThreadMXBean extends PlatformManagedObject
Java虚拟机具有此接口的实现类的单个实例。 实现此接口的实例是MXBean ,可以通过调用ManagementFactory.getThreadMXBean()
方法或从platform MBeanServer
方法获得。
该ObjectName用于唯一识别的MXBean为一个MBeanServer内螺纹的系统是:
java.lang:type=Threading
可以通过调用PlatformManagedObject.getObjectName()
方法获得。
Thread.getId()
方法返回的正长值。
线程ID在其一生中是唯一的。
当线程被终止时,该线程ID可以被重用。
该接口中的一些方法采用线程ID或线程ID数组作为输入参数,并返回每线程信息。
isThreadCpuTimeSupported()
方法可用于确定Java虚拟机是否支持测量任何线程的CPU时间。 isCurrentThreadCpuTimeSupported()
方法可用于确定Java虚拟机是否支持测量当前线程的CPU时间。 支持任何线程的CPU时间测量的Java虚拟机实现也将支持当前线程。
该接口提供的CPU时间具有纳秒精度,但不一定是纳秒精度。
默认情况下,Java虚拟机可能会禁用CPU时间测量。 isThreadCpuTimeEnabled()
和setThreadCpuTimeEnabled(boolean)
方法可用于测试是否启用CPU时间测量,并分别启用/禁用此支持。 在一些Java虚拟机实现中启用线程CPU测量可能是昂贵的。
isThreadContentionMonitoringSupported()
方法可用于确定Java虚拟机是否支持线程争用监控。 默认情况下禁用线程争用监控。 setThreadContentionMonitoringEnabled(boolean)
方法可用于启用线程争用监控。
getThreadInfo(long[], boolean, boolean)
和dumpAllThreads(boolean, boolean)
方法可用于获取线程堆栈跟踪和同步信息, 包括某个线程被阻塞以获取或等待并且锁定线程当前拥有的线程堆栈跟踪和同步信息。
ThreadMXBean接口提供findMonitorDeadlockedThreads()
和findDeadlockedThreads()
方法来查找正在运行的应用程序中的死锁。
ManagementFactory.getPlatformMXBeans(Class)
,
JMX Specification. ,
Ways to Access MXBeans
Modifier and Type | Method and Description |
---|---|
ThreadInfo[] |
dumpAllThreads(boolean lockedMonitors, boolean lockedSynchronizers)
使用堆栈跟踪和同步信息返回所有实时线程的线程信息。
|
long[] |
findDeadlockedThreads()
查找处于死锁等待获取对象监视器的线程的循环,或
ownable synchronizers 。
|
long[] |
findMonitorDeadlockedThreads()
查找处于死锁等待获取对象监视器的线程的循环。
|
long[] |
getAllThreadIds()
返回所有活动线程ID。
|
long |
getCurrentThreadCpuTime()
以纳秒为单位返回当前线程的总CPU时间。
|
long |
getCurrentThreadUserTime()
返回当前线程以纳秒为单位在用户模式下执行的CPU时间。
|
int |
getDaemonThreadCount()
返回当前的守护进程线程数。
|
int |
getPeakThreadCount()
返回Java虚拟机启动或峰值复位后的峰值活动线程数。
|
int |
getThreadCount()
返回当前线程数,包括守护进程线程和非守护程序线程数。
|
long |
getThreadCpuTime(long id)
以纳秒为单位返回指定ID的线程的总CPU时间。
|
ThreadInfo |
getThreadInfo(long id)
返回没有堆栈跟踪的指定
id的线程的线程信息。
|
ThreadInfo[] |
getThreadInfo(long[] ids)
返回其ID为输入数组
ids中的每个线程的线程信息,不带堆栈跟踪。
|
ThreadInfo[] |
getThreadInfo(long[] ids, boolean lockedMonitors, boolean lockedSynchronizers)
返回其ID为输入数组
ids的每个线程的线程信息,并具有堆栈跟踪和同步信息。
|
ThreadInfo[] |
getThreadInfo(long[] ids, int maxDepth)
返回其ID为输入数组
ids的每个线程的线程信息,堆栈跟踪为指定数量的堆栈跟踪元素。
|
ThreadInfo |
getThreadInfo(long id, int maxDepth)
返回指定
id的线程的线程信息,并带有堆栈跟踪元素指定数量的堆栈跟踪。
|
long |
getThreadUserTime(long id)
返回指定ID的线程在用户模式下以纳秒为单位的CPU时间。
|
long |
getTotalStartedThreadCount()
返回自Java虚拟机启动以来创建并启动的线程总数。
|
boolean |
isCurrentThreadCpuTimeSupported()
测试Java虚拟机是否支持当前线程的CPU时间测量。
|
boolean |
isObjectMonitorUsageSupported()
测试Java虚拟机是否支持监视对象监视器的使用情况。
|
boolean |
isSynchronizerUsageSupported()
测试Java虚拟机是否支持对
ownable synchronizer的使用情况的
监控 。
|
boolean |
isThreadContentionMonitoringEnabled()
测试是否启用线程争用监控。
|
boolean |
isThreadContentionMonitoringSupported()
测试Java虚拟机是否支持线程争用监控。
|
boolean |
isThreadCpuTimeEnabled()
测试线程CPU时间测量是否启用。
|
boolean |
isThreadCpuTimeSupported()
测试Java虚拟机实现是否支持任何线程的CPU时间测量。
|
void |
resetPeakThreadCount()
将峰值线程计数重置为当前线程数。
|
void |
setThreadContentionMonitoringEnabled(boolean enable)
启用或禁用线程争用监控。
|
void |
setThreadCpuTimeEnabled(boolean enable)
启用或禁用线程CPU时间测量。
|
getObjectName
int getThreadCount()
int getPeakThreadCount()
long getTotalStartedThreadCount()
int getDaemonThreadCount()
long[] getAllThreadIds()
SecurityException
- 如果安全管理器存在并且调用者没有ManagementPermission(“监视器”)。
ThreadInfo getThreadInfo(long id)
getThreadInfo(id, 0);
此方法返回一个表示指定ID的线程的线程信息的ThreadInfo对象。 返回的ThreadInfo对象中的堆栈跟踪,锁定的监视器和锁定的同步器将为空。 如果给定ID的线程不存在或不存在,则此方法将返回null 。 如果一个线程已经启动并且尚未死亡,那么线程是活着的。
MBeanServer访问 :
ThreadInfo的映射类型是CompositeData ,其属性在ThreadInfo.from
方法中指定 。
id
- 线程的线程ID。
必须是积极的。
ThreadInfo
对象的给定ID的线程没有堆栈跟踪,没有锁定的监视器,没有同步器信息;
null如果给定ID的线程不存在或不存在。
IllegalArgumentException
- 如果
id <= 0
。
SecurityException
- 如果安全管理器存在并且调用者没有ManagementPermission(“监视器”)。
ThreadInfo[] getThreadInfo(long[] ids)
getThreadInfo
(ids, 0);
此方法返回一个ThreadInfo对象的数组。 每个ThreadInfo对象中的堆栈跟踪,锁定的监视器和锁定的同步器将为空。 如果给定ID的线程不存在或不存在,则返回的数组中的相应元素将包含null 。 如果一个线程已经启动并且尚未死亡,那么线程是活着的。
MBeanServer访问 :
ThreadInfo的映射类型是CompositeData ,其属性在ThreadInfo.from
方法中指定 。
ids
- 线程ID数组。
ThreadInfo
对象的数组,每个对象包含一个线程的信息,该线程的ID位于ID的输入数组的相应元素中,没有堆栈跟踪,没有锁定的监视器,没有同步器信息。
IllegalArgumentException
- 输入数组
ids中的任何元素
是否为
<= 0
。
SecurityException
- 如果安全管理器存在,并且调用者没有ManagementPermission(“监视器”)。
ThreadInfo getThreadInfo(long id, int maxDepth)
StackTraceElement
。
如果maxDepth == Integer.MAX_VALUE ,线程的整个堆栈跟踪将被转储。
如果maxDepth == 0 ,线程的堆栈跟踪不会被转储。
该方法不能获得线程锁定的监视器和锁定的同步器。
当Java虚拟机具有关于一个线程或maxDepth == 0没有堆栈跟踪信息,在ThreadInfo对象堆栈跟踪将是StackTraceElement空数组。
如果给定ID的线程不存在或不存在,则此方法将返回null 。 如果一个线程已经启动并且尚未死亡,那么线程是活着的。
MBeanServer访问 :
ThreadInfo的映射类型是CompositeData ,其属性在ThreadInfo.from
方法中指定 。
id
- 线程的线程ID。
必须是积极的。
maxDepth
- 要转储的堆栈跟踪中的最大条目数。
Integer.MAX_VALUE可以用来请求整个堆栈被转储。
ThreadInfo
的给定ID的线程,没有锁定的监视器和同步器信息。
null如果给定ID的线程不存在或不存在。
IllegalArgumentException
- 如果
id <= 0
。
IllegalArgumentException
- 如果
maxDepth is negative 。
SecurityException
- 如果安全管理器存在,并且调用者没有ManagementPermission(“监视器”)。
ThreadInfo[] getThreadInfo(long[] ids, int maxDepth)
StackTraceElement
。
如果maxDepth == Integer.MAX_VALUE ,线程的整个堆栈跟踪将被转储。
如果maxDepth == 0 ,线程的堆栈跟踪不会被转储。
该方法不能获得锁定的监视器和锁定的线程的同步器。
当Java虚拟机具有关于一个线程或maxDepth == 0没有堆栈跟踪信息,在ThreadInfo对象堆栈跟踪将是StackTraceElement空数组。
此方法返回一个ThreadInfo对象的数组,每个对象是与ids数组相同索引的线程的线程信息。 如果给定ID的线程不存在或不存在,则null将被设置在返回的数组的相应元素中。 如果一个线程已经启动并且尚未死亡,那么线程是活着的。
MBeanServer访问 :
ThreadInfo的映射类型是CompositeData ,具有ThreadInfo.from
方法中指定的属性 。
ids
- 一个线程ID数组
maxDepth
- 要转储的堆栈跟踪中的最大条目数。
Integer.MAX_VALUE可以用来请求整个栈被转储。
ThreadInfo
对象的数组,每个对象都包含有关其ID位于ID的输入数组的相应元素中的线程的信息,没有锁定的监视器和同步器信息。
IllegalArgumentException
- 如果
maxDepth is negative 。
IllegalArgumentException
- 如果输入数组中的任何元素
ids是
<= 0
。
SecurityException
- 如果安全管理器存在并且调用者没有ManagementPermission(“监视器”)。
boolean isThreadContentionMonitoringSupported()
boolean isThreadContentionMonitoringEnabled()
UnsupportedOperationException
- 如果Java虚拟机不支持线程争用监控。
isThreadContentionMonitoringSupported()
void setThreadContentionMonitoringEnabled(boolean enable)
enable
- true启用;
false禁用。
UnsupportedOperationException
- 如果Java虚拟机不支持线程争用监控。
SecurityException
- 如果安全管理器存在并且调用者没有ManagementPermission(“控制”)。
isThreadContentionMonitoringSupported()
long getCurrentThreadCpuTime()
这是一种方便本地管理使用的方法,相当于调用:
getThreadCpuTime
(Thread.currentThread().getId());
UnsupportedOperationException
- 如果Java虚拟机不支持当前线程的CPU时间测量。
getCurrentThreadUserTime()
,
isCurrentThreadCpuTimeSupported()
,
isThreadCpuTimeEnabled()
,
setThreadCpuTimeEnabled(boolean)
long getCurrentThreadUserTime()
这是一种方便本地管理使用的方法,相当于调用:
getThreadUserTime
(Thread.currentThread().getId());
UnsupportedOperationException
- 如果Java虚拟机不支持当前线程的CPU时间测量。
getCurrentThreadCpuTime()
,
isCurrentThreadCpuTimeSupported()
,
isThreadCpuTimeEnabled()
,
setThreadCpuTimeEnabled(boolean)
long getThreadCpuTime(long id)
如果指定ID的线程不存在或不存在,则此方法返回-1 。 如果禁用CPU时间测量,此方法返回-1 。 如果一个线程已经启动并且尚未死亡,那么线程是活着的。
如果在线程启动后启用CPU时间测量,则Java虚拟机实现可以选择任何时间,并将能力启用的时间包括在CPU时间测量开始的时间。
id
- 线程的线程ID
IllegalArgumentException
- 如果
id <= 0
。
UnsupportedOperationException
- 如果Java虚拟机不支持其他线程的CPU时间测量。
getThreadUserTime(long)
,
isThreadCpuTimeSupported()
,
isThreadCpuTimeEnabled()
,
setThreadCpuTimeEnabled(boolean)
long getThreadUserTime(long id)
如果指定ID的线程不存在或不存在,则此方法返回-1 。 如果禁用CPU时间测量,此方法返回-1 。 如果一个线程已经启动并且尚未死亡,那么线程是活着的。
如果在线程启动后启用CPU时间测量,则Java虚拟机实现可以选择任何时间,并将能力启用的时间包括在CPU时间测量开始的时间。
id
- 线程的线程ID
IllegalArgumentException
- 如果
id <= 0
。
UnsupportedOperationException
- 如果Java虚拟机不支持其他线程的CPU时间测量。
getThreadCpuTime(long)
,
isThreadCpuTimeSupported()
,
isThreadCpuTimeEnabled()
,
setThreadCpuTimeEnabled(boolean)
boolean isThreadCpuTimeSupported()
boolean isCurrentThreadCpuTimeSupported()
isThreadCpuTimeSupported()
回报true。
boolean isThreadCpuTimeEnabled()
UnsupportedOperationException
- 如果Java虚拟机不支持其他线程或当前线程的CPU时间测量。
isThreadCpuTimeSupported()
,
isCurrentThreadCpuTimeSupported()
void setThreadCpuTimeEnabled(boolean enable)
enable
- true启用;
false禁用。
UnsupportedOperationException
- 如果Java虚拟机不支持任何线程或当前线程的CPU时间测量。
SecurityException
- 如果安全管理器存在,并且调用者没有ManagementPermission(“控制”)。
isThreadCpuTimeSupported()
,
isCurrentThreadCpuTimeSupported()
long[] findMonitorDeadlockedThreads()
Object.wait
调用后重新进入同步块的线程,其中每个线程拥有一个监视器,同时尝试获取另一个线程在一个周期中已经拥有的另一个监视器。
更正式地,如果线程是“正在等待拥有的对象监视器”的关系的一个循环的一部分,则线程是监视器死锁 。 在最简单的情况下,线程A被阻塞等待线程B拥有的监视器,并且线程B被阻塞等待线程A拥有的监视器。
此方法专门用于故障排除,但不用于同步控制。 这可能是一个昂贵的操作。
此方法发现只涉及对象监视器的死锁。 要查找涉及对象监视器和ownable synchronizers的死锁 ,应使用findDeadlockedThreads
方法。
SecurityException
- 如果安全管理器存在,并且调用者没有ManagementPermission(“监视器”)。
findDeadlockedThreads()
void resetPeakThreadCount()
SecurityException
- 如果安全管理器存在,并且调用者没有ManagementPermission(“控制”)。
getPeakThreadCount()
,
getThreadCount()
long[] findDeadlockedThreads()
此方法专门用于故障排除,但不用于同步控制。 这可能是一个昂贵的操作。
SecurityException
- 如果安全管理器存在,并且调用者没有ManagementPermission(“监视器”)。
UnsupportedOperationException
- 如果Java虚拟机不支持监视自己的同步器使用情况。
isSynchronizerUsageSupported()
,
findMonitorDeadlockedThreads()
boolean isObjectMonitorUsageSupported()
dumpAllThreads(boolean, boolean)
boolean isSynchronizerUsageSupported()
dumpAllThreads(boolean, boolean)
ThreadInfo[] getThreadInfo(long[] ids, boolean lockedMonitors, boolean lockedSynchronizers)
该方法获取每个线程的线程信息的快照,包括:
此方法返回一个ThreadInfo对象的数组,每个对象的线程信息与ids数组具有相同的索引。 如果给定ID的线程不存在或不存在,则null将在返回的数组的相应元素中设置。 如果一个线程已经启动并且尚未死亡,那么线程是活着的。
如果一个线程没有锁定任何对象监视器或lockedMonitors是false ,返回的ThreadInfo对象将有一个空的MonitorInfo数组。 同样,如果一个线程没有锁定任何同步器,或者lockedSynchronizers是false ,返回的ThreadInfo对象将有一个空的LockInfo数组。
当lockedMonitors和lockedSynchronizers参数均为false时,相当于调用:
getThreadInfo(ids, Integer.MAX_VALUE)
此方法专门用于故障排除,但不用于同步控制。 这可能是一个昂贵的操作。
MBeanServer访问 :
ThreadInfo的映射类型是CompositeData ,其属性在ThreadInfo.from
方法中指定 。
ids
- 一个线程ID数组。
lockedMonitors
- 如果
true检索所有锁定的监视器。
lockedSynchronizers
- 如果
true检索所有可锁定的同步器。
ThreadInfo
对象的数组,每个对象包含有关其ID位于ID的输入数组的相应元素中的线程的信息。
SecurityException
- 如果安全管理器存在并且调用者没有ManagementPermission(“监视器”)。
UnsupportedOperationException
-
isObjectMonitorUsageSupported()
,
isSynchronizerUsageSupported()
ThreadInfo[] dumpAllThreads(boolean lockedMonitors, boolean lockedSynchronizers)
此方法返回一个ThreadInfo
对象的数组,如getThreadInfo(long[], boolean, boolean)
所示 。
lockedMonitors
- 如果
true ,转储所有锁定的监视器。
lockedSynchronizers
- 如果
true ,转储所有锁定的拥有的同步器。
ThreadInfo
的所有活动线程。
SecurityException
- 如果安全管理器存在且呼叫者没有ManagementPermission(“监视器”)。
UnsupportedOperationException
-
isObjectMonitorUsageSupported()
,
isSynchronizerUsageSupported()