Module java.management

Interface ThreadMXBean

所有超级接口:
PlatformManagedObject
所有已知子接口:
ThreadMXBean

public interface ThreadMXBean extends PlatformManagedObject
Java虚拟机线程系统的管理接口。

ThreadMXBean支持监视和管理Java虚拟机中的平台线程。平台线程通常映射到由操作系统调度的内核线程。ThreadMXBean不支持监视或管理虚拟线程

Java虚拟机有一个实现此接口的实现类的单个实例。实现此接口的实例是一个MXBean,可以通过调用ManagementFactory.getThreadMXBean()方法或从platform MBeanServer方法获取。

用于在MBeanServer中唯一标识线程系统的MXBean的ObjectName是:

java.lang:type=Threading
可以通过调用PlatformManagedObject.getObjectName()方法获取。

线程ID

线程ID是通过调用线程的threadId()方法返回的正长整型值。线程ID在其生命周期内是唯一的。当线程终止时,其线程ID可能会被重用。

此接口中的一些方法将线程ID或线程ID数组作为输入参数,并返回每个线程的信息。

线程CPU时间

Java虚拟机实现可能支持测量当前平台线程、任何平台线程或没有线程的CPU时间。

可以使用isThreadCpuTimeSupported()方法来确定Java虚拟机是否支持测量任何平台线程的CPU时间。可以使用isCurrentThreadCpuTimeSupported()方法来确定Java虚拟机是否支持使用getCurrentThreadCpuTime()getCurrentThreadUserTime()方法从平台线程测量CPU时间。

此接口提供的CPU时间具有纳秒精度,但不一定具有纳秒精确度。

Java虚拟机可能默认禁用CPU时间测量。可以使用isThreadCpuTimeEnabled()setThreadCpuTimeEnabled(boolean)方法来测试CPU时间测量是否已启用,并分别启用/禁用此支持。在某些Java虚拟机实现中,启用线程CPU测量可能很昂贵。

线程争用监视

一些Java虚拟机可能支持线程争用监视。启用线程争用监视时,将收集并返回线程已阻塞同步或等待通知的累积经过时间,该时间将在ThreadInfo对象中返回。

可以使用isThreadContentionMonitoringSupported()方法来确定Java虚拟机是否支持线程争用监视。线程争用监视默认情况下是禁用的。可以使用setThreadContentionMonitoringEnabled(boolean)方法来启用线程争用监视。

同步信息和死锁检测

一些Java虚拟机可能支持监视对象监视器使用可拥有同步器使用。可以使用getThreadInfo(long[], boolean, boolean)dumpAllThreads(boolean, boolean)方法来获取线程堆栈跟踪和同步信息,包括线程正在阻塞以获取或等待的以及线程当前拥有的锁。

ThreadMXBean接口提供了findMonitorDeadlockedThreads()findDeadlockedThreads()方法,用于查找运行应用程序中的死锁。

自版本:
1.5
参见:
  • Method Details

    • getThreadCount

      int getThreadCount()
      返回当前活动的平台线程数,包括守护线程和非守护线程。计数不包括虚拟线程。
      返回:
      当前活动的平台线程数。
    • getPeakThreadCount

      int getPeakThreadCount()
      返回自Java虚拟机启动或峰值被重置以来的最大活动平台线程数。计数不包括虚拟线程。
      返回:
      峰值活动平台线程数。
    • getTotalStartedThreadCount

      long getTotalStartedThreadCount()
      返回自Java虚拟机启动以来创建并启动的平台线程总数。计数不包括虚拟线程。
      返回:
      启动的平台线程总数。
    • getDaemonThreadCount

      int getDaemonThreadCount()
      返回当前活动的守护线程数。计数不包括虚拟线程。
      返回:
      当前活动的守护线程数。
    • getAllThreadIds

      long[] getAllThreadIds()
      返回所有活动平台线程的线程ID。不包括虚拟线程的线程ID。在此方法返回时,返回的数组中可能包含已终止的一些线程。
      返回:
      一个long数组,每个元素是一个线程ID。
      抛出:
      SecurityException - 如果存在安全管理器且调用方没有ManagementPermission("monitor")。
    • getThreadInfo

      ThreadInfo getThreadInfo(long id)
      返回指定id的线程信息,不包含堆栈跟踪。此方法等效于调用:
      getThreadInfo(id, 0);

      此方法返回代表指定ID线程信息的ThreadInfo对象。返回的ThreadInfo对象中的堆栈跟踪、锁定监视器和锁定同步器将为空。如果给定ID的线程是虚拟线程、未存活或不存在,则此方法将返回null。线程是存活的,如果已启动且尚未终止。

      MBeanServer访问:
      ThreadInfo的映射类型是CompositeData,其属性如ThreadInfo.from方法中所指定。

      参数:
      id - 线程的线程ID。必须为正数。
      返回:
      给定ID的线程的ThreadInfo对象,不包含堆栈跟踪、锁定监视器和同步器信息;如果给定ID的线程是虚拟线程、未存活或不存在,则返回null
      抛出:
      IllegalArgumentException - 如果id <= 0
      SecurityException - 如果存在安全管理器且调用者没有ManagementPermission("monitor")。
    • getThreadInfo

      ThreadInfo[] getThreadInfo(long[] ids)
      返回输入数组ids中每个ID对应的线程信息,不包含堆栈跟踪。此方法等效于调用:
         getThreadInfo(ids, 0);
       

      此方法返回ThreadInfo对象的数组。每个ThreadInfo对象中的堆栈跟踪、锁定监视器和锁定同步器将为空。如果给定ID的线程是虚拟线程、未存活或不存在,则返回数组中相应元素将包含null。线程是存活的,如果已启动且尚未终止。

      MBeanServer访问:
      ThreadInfo的映射类型是CompositeData,其属性如ThreadInfo.from方法中所指定。

      参数:
      ids - 线程ID的数组。
      返回:
      ThreadInfo对象的数组,每个对象包含与输入ID数组中相应元素的线程信息,不包含堆栈跟踪、锁定监视器和同步器信息。
      抛出:
      IllegalArgumentException - 如果输入数组ids中的任何元素为<= 0
      SecurityException - 如果存在安全管理器且调用者没有ManagementPermission("monitor")。
    • getThreadInfo

      ThreadInfo getThreadInfo(long id, int maxDepth)
      返回指定id的线程信息,包含指定数量的堆栈跟踪元素。 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来请求转储整个堆栈。
      返回:
      给定ID的线程的ThreadInfo,不包含锁定监视器和同步器信息。如果给定ID的线程是虚拟线程、未存活或不存在,则返回null
      抛出:
      IllegalArgumentException - 如果id <= 0
      IllegalArgumentException - 如果maxDepth is negative
      SecurityException - 如果存在安全管理器且调用者没有ManagementPermission("monitor")。
    • getThreadInfo

      ThreadInfo[] getThreadInfo(long[] ids, int maxDepth)
      返回输入数组ids中每个ID对应的线程信息,包含指定数量的堆栈跟踪元素。 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数组中相应元素的线程信息,不包含锁定监视器和同步器信息。
      抛出:
      IllegalArgumentException - 如果maxDepth is negative
      IllegalArgumentException - 如果输入数组ids中的任何元素为<= 0
      SecurityException - 如果存在安全管理器且调用者没有ManagementPermission("monitor")。
    • isThreadContentionMonitoringSupported

      boolean isThreadContentionMonitoringSupported()
      测试Java虚拟机是否支持线程争用监视。
      返回:
      如果Java虚拟机支持线程争用监视,则返回true;否则返回false
    • isThreadContentionMonitoringEnabled

      boolean isThreadContentionMonitoringEnabled()
      测试线程争用监视是否已启用。
      返回:
      如果线程争用监视已启用,则返回true;否则返回false
      抛出:
      UnsupportedOperationException - 如果Java虚拟机不支持线程争用监视。
      参见:
    • setThreadContentionMonitoringEnabled

      void setThreadContentionMonitoringEnabled(boolean enable)
      启用或禁用线程争用监视。线程争用监视默认情况下是禁用的。
      参数:
      enable - true表示启用;false表示禁用。
      抛出:
      UnsupportedOperationException - 如果Java虚拟机不支持线程争用监视。
      SecurityException - 如果存在安全管理器且调用者没有ManagementPermission("control")。
      参见:
    • getCurrentThreadCpuTime

      long getCurrentThreadCpuTime()
      返回当前线程的总CPU时间(以纳秒为单位)。返回的值精确到纳秒,但不一定是纳秒精度。如果实现区分用户模式时间和系统模式时间,则返回的CPU时间是当前线程在用户模式或系统模式下执行的时间。

      这是用于本地管理使用的便利方法,等效于调用:

         getThreadCpuTime(Thread.currentThread().threadId());
       
      返回值:
      如果当前线程是平台线程且启用了CPU时间测量,则返回当前线程的总CPU时间;否则返回-1
      抛出:
      UnsupportedOperationException - 如果Java虚拟机不支持对当前线程进行CPU时间测量。
      参见:
    • getCurrentThreadUserTime

      long getCurrentThreadUserTime()
      返回当前线程在用户模式下执行的CPU时间(以纳秒为单位)。返回值精确到纳秒,但不一定是纳秒精确度。

      这是一个用于本地管理的便利方法,等效于调用:

         getThreadUserTime(Thread.currentThread().threadId());
       
      返回值:
      如果当前线程是平台线程且启用了CPU时间测量,则返回当前线程的用户级CPU时间;否则返回-1
      抛出:
      UnsupportedOperationException - 如果Java虚拟机不支持对当前线程进行CPU时间测量。
      参见:
    • getThreadCpuTime

      long getThreadCpuTime(long id)
      返回指定ID线程的总CPU时间(以纳秒为单位)。返回值精确到纳秒,但不一定是纳秒精确度。如果实现区分用户模式时间和系统模式时间,则返回的CPU时间是线程在用户模式或系统模式下执行的时间。

      如果指定ID的线程是虚拟线程、未启动或不存在,则此方法返回-1。如果禁用了CPU时间测量,则此方法返回-1。线程处于活动状态表示已启动但尚未终止。

      如果在线程启动后启用了CPU时间测量,则Java虚拟机实现可以选择任何时间作为CPU时间测量开始的时间,直到启用该功能为止。

      参数:
      id - 线程的线程ID
      返回值:
      如果指定ID的线程是平台线程、线程处于活动状态且启用了CPU时间测量,则返回指定ID线程的总CPU时间;否则返回-1
      抛出:
      IllegalArgumentException - 如果id <= 0
      UnsupportedOperationException - 如果Java虚拟机不支持对其他线程进行CPU时间测量。
      参见:
    • getThreadUserTime

      long getThreadUserTime(long id)
      返回指定ID线程在用户模式下执行的CPU时间(以纳秒为单位)。返回值精确到纳秒,但不一定是纳秒精确度。

      如果指定ID的线程是虚拟线程、未启动或不存在,则此方法返回-1。如果禁用了CPU时间测量,则此方法返回-1。线程处于活动状态表示已启动但尚未终止。

      如果在线程启动后启用了CPU时间测量,则Java虚拟机实现可以选择任何时间作为CPU时间测量开始的时间,直到启用该功能为止。

      参数:
      id - 线程的线程ID
      返回值:
      如果指定ID的线程是平台线程、线程处于活动状态且启用了CPU时间测量,则返回指定ID线程的用户级CPU时间;否则返回-1
      抛出:
      IllegalArgumentException - 如果id <= 0
      UnsupportedOperationException - 如果Java虚拟机不支持对其他线程进行CPU时间测量。
      参见:
    • isThreadCpuTimeSupported

      boolean isThreadCpuTimeSupported()
      测试Java虚拟机实现是否支持对任何平台线程进行CPU时间测量。支持对任何平台线程进行CPU时间测量的Java虚拟机实现也将支持当前线程是平台线程时的CPU时间测量。
      返回值:
      如果Java虚拟机支持对任何平台线程进行CPU时间测量,则返回true;否则返回false
    • isCurrentThreadCpuTimeSupported

      boolean isCurrentThreadCpuTimeSupported()
      测试Java虚拟机是否支持从平台线程进行CPU时间测量,使用getCurrentThreadCpuTime()getCurrentThreadUserTime()方法。如果isThreadCpuTimeSupported()返回true,则此方法返回true
      返回值:
      如果Java虚拟机支持对当前平台线程进行CPU时间测量,则返回true;否则返回false
    • isThreadCpuTimeEnabled

      boolean isThreadCpuTimeEnabled()
      测试线程CPU时间测量是否已启用。
      返回值:
      如果线程CPU时间测量已启用,则返回true;否则返回false
      抛出:
      UnsupportedOperationException - 如果Java虚拟机不支持对其他线程或当前线程进行CPU时间测量。
      参见:
    • setThreadCpuTimeEnabled

      void setThreadCpuTimeEnabled(boolean enable)
      启用或禁用线程CPU时间测量。默认值取决于平台。
      参数:
      enable - true表示启用;false表示禁用。
      抛出:
      UnsupportedOperationException - 如果Java虚拟机不支持对任何线程或当前线程进行CPU时间测量。
      SecurityException - 如果存在安全管理器且调用方没有ManagementPermission("control")。
      参见:
    • findMonitorDeadlockedThreads

      long[] findMonitorDeadlockedThreads()
      查找处于死锁状态的平台线程的循环,这些线程正在等待获取对象监视器。即,处于阻塞状态的平台线程正在等待进入同步块或在Object.wait调用后重新进入同步块,其中每个平台线程拥有一个监视器,同时尝试获取另一个已被另一个平台线程持有的监视器的循环。此方法不会找到包含虚拟线程的循环。

      更正式地,如果线程A被阻塞等待线程B拥有的监视器,而线程B被阻塞等待线程A拥有的监视器,则线程被称为监视器死锁

      此方法设计用于故障排除,而不是用于同步控制。这可能是一个昂贵的操作。

      此方法仅查找涉及对象监视器的死锁。要查找涉及对象监视器和可拥有同步器的死锁,应使用findDeadlockedThreads方法。

      返回值:
      如果存在处于监视器死锁状态的平台线程,则返回这些线程的ID数组;否则返回null
      抛出:
      SecurityException - 如果存在安全管理器且调用方没有ManagementPermission("monitor")。
      参见:
    • resetPeakThreadCount

      void resetPeakThreadCount()
      将峰值线程计数重置为当前活动平台线程数。
      抛出:
      SecurityException - 如果存在安全管理器且调用方没有ManagementPermission("control")。
      参见:
    • findDeadlockedThreads

      long[] findDeadlockedThreads()
      查找处于死锁状态的平台线程的循环,这些线程正在等待获取对象监视器或可拥有同步器。如果每个线程在尝试获取另一个线程已持有的锁时拥有一个锁,而这些线程形成循环并等待锁,则平台线程将处于死锁状态。此方法不会找到包括虚拟线程的循环。

      此方法设计用于故障排除,而不是用于同步控制。这可能是一个昂贵的操作。

      返回:
      如果有等待对象监视器或可拥有同步器的平台线程的ID数组,则返回该数组;否则返回null
      抛出:
      SecurityException - 如果存在安全管理器且调用方没有ManagementPermission("monitor")。
      UnsupportedOperationException - 如果Java虚拟机不支持监视可拥有同步器的使用。
      自:
      1.6
      参见:
    • isObjectMonitorUsageSupported

      boolean isObjectMonitorUsageSupported()
      测试Java虚拟机是否支持监视对象监视器的使用。
      返回:
      如果Java虚拟机支持监视对象监视器的使用,则返回true;否则返回false
      自:
      1.6
      参见:
    • isSynchronizerUsageSupported

      boolean isSynchronizerUsageSupported()
      测试Java虚拟机是否支持监视可拥有同步器的使用。
      返回:
      如果Java虚拟机支持监视可拥有同步器的使用,则返回true;否则返回false
      自:
      1.6
      参见:
    • getThreadInfo

      ThreadInfo[] getThreadInfo(long[] ids, boolean lockedMonitors, boolean lockedSynchronizers)
      返回每个ID在输入数组ids中的平台线程的线程信息,包括堆栈跟踪和同步信息。这等效于调用:
      getThreadInfo(ids, lockedMonitors, lockedSynchronizers, Integer.MAX_VALUE)
      参数:
      ids - 一个线程ID数组。
      lockedMonitors - 如果为true,则检索所有已锁定的监视器。
      lockedSynchronizers - 如果为true,则检索所有已锁定的可拥有同步器。
      返回:
      包含有关ID数组中相应元素中的线程信息的ThreadInfo对象数组。
      抛出:
      SecurityException - 如果存在安全管理器且调用方没有ManagementPermission("monitor")。
      UnsupportedOperationException -
      自:
      1.6
      参见:
    • getThreadInfo

      default ThreadInfo[] getThreadInfo(long[] ids, boolean lockedMonitors, boolean lockedSynchronizers, int maxDepth)
      返回每个ID在输入数组ids中的线程的线程信息,包括指定数量元素的堆栈跟踪和同步信息。如果maxDepth == 0,则不会转储线程的堆栈跟踪。

      此方法获取每个线程的线程信息快照,包括:

      • 指定数量元素的堆栈跟踪,
      • 如果lockedMonitorstrue,则当前线程当前锁定的对象监视器,
      • 如果lockedSynchronizerstrue,则当前线程当前锁定的可拥有同步器

      此方法返回一个ThreadInfo对象数组,每个对象是关于与ids数组中相同索引处的线程的线程信息。如果给定ID的线程是虚拟线程、不活动或不存在,则在返回的数组中相应元素中将设置为null。线程是活动的,如果它已启动且尚未终止。

      如果线程不锁定任何对象监视器或lockedMonitorsfalse,则返回的ThreadInfo对象将具有一个空的MonitorInfo数组。类似地,如果线程不锁定任何同步器或lockedSynchronizersfalse,则返回的ThreadInfo对象将具有一个空的LockInfo数组。

      lockedMonitorslockedSynchronizers参数都为false时,等效于调用:

           getThreadInfo(ids, maxDepth)
       

      此方法设计用于故障排除,而不是用于同步控制。这可能是一个昂贵的操作。

      MBeanServer访问:
      ThreadInfo的映射类型是CompositeData,具有在ThreadInfo.from方法中指定的属性。

      实现要求:
      默认实现会抛出UnsupportedOperationException
      参数:
      ids - 一个线程ID数组。
      lockedMonitors - 如果为true,则检索所有已锁定的监视器。
      lockedSynchronizers - 如果为true,则检索所有已锁定的可拥有同步器。
      maxDepth - 指示从堆栈跟踪中检索的最大StackTraceElement数。
      返回:
      包含有关ID数组中相应元素中的线程信息的ThreadInfo对象数组。
      抛出:
      IllegalArgumentException - 如果maxDepth为负数。
      SecurityException - 如果存在安全管理器且调用方没有ManagementPermission("monitor")。
      UnsupportedOperationException -
      自:
      10
      参见:
    • dumpAllThreads

      ThreadInfo[] dumpAllThreads(boolean lockedMonitors, boolean lockedSynchronizers)
      返回所有活动平台线程的线程信息,包括堆栈跟踪和同步信息。不包括虚拟线程的线程ID。此方法等效于调用:
      dumpAllThreads(lockedMonitors, lockedSynchronizers, Integer.MAX_VALUE)
      参数:
      lockedMonitors - 如果为true,则转储所有已锁定的监视器。
      lockedSynchronizers - 如果为true,则转储所有已锁定的可拥有同步器。
      返回:
      所有活动平台线程的ThreadInfo数组。
      抛出:
      SecurityException - 如果存在安全管理器且调用方没有ManagementPermission("monitor")。
      UnsupportedOperationException -
      自:
      1.6
      参见:
    • dumpAllThreads

      default ThreadInfo[] dumpAllThreads(boolean lockedMonitors, boolean lockedSynchronizers, int maxDepth)
      返回所有活动平台线程的线程信息,包括指定数量元素的堆栈跟踪和同步信息。如果maxDepth == 0,则不会转储线程的堆栈跟踪。虚拟线程的线程ID不包括在内。在此方法返回时,返回数组中包含的一些线程可能已经终止。

      此方法返回一个ThreadInfo对象数组,如getThreadInfo(long[], boolean, boolean, int)方法中所述。

      实现要求:
      默认实现会抛出UnsupportedOperationException
      参数:
      lockedMonitors - 如果为true,则转储所有锁定的监视器。
      lockedSynchronizers - 如果为true,则转储所有锁定的可拥有同步器。
      maxDepth - 表示从堆栈跟踪中检索的最大数量StackTraceElement
      返回:
      所有活动平台线程的ThreadInfo数组。
      抛出:
      IllegalArgumentException - 如果maxDepth为负数。
      SecurityException - 如果存在安全管理器且调用者没有ManagementPermission("monitor")。
      UnsupportedOperationException -
      自:
      10
      参见: