IntelliJ IDEA 2025.3 Help

线程转储

线程转储是一种用于检查应用程序在特定瞬间状态的工具。 它们提供了应用程序中线程及其堆栈跟踪的列表,可用于调试死锁或无响应 UI 等问题。 线程转储的主要优点是它们使用纯文本格式,并且有大量工具可以捕获和处理它们。

IntelliJ IDEA 允许你为正在运行的进程捕获线程转储,并解释在 IntelliJ IDEA 或其他工具(如 jstack jcmd )中获取的外部线程转储。

IntelliJ IDEA 支持由 JDK 工具生成的格式,最高可达版本 25。

从 IntelliJ IDEA 捕获线程转储

  1. 从 IntelliJ IDEA 运行程序时:在 运行 工具窗口的工具栏中,点击 转储线程

    运行工具窗口工具栏上的转储线程按钮
  2. 从 IntelliJ IDEA 调试程序时:在 调试 工具窗口的工具栏中,点击 更多更多 ,然后选择 获取线程转储

    调试工具窗口工具栏上的更多按钮
  3. 针对本地运行的任何 Java/Kotlin 进程:在 首页 选项卡的 分析器 工具窗口中,点击要为其创建线程转储的进程。 请选择 获取线程转储

    右键点击 Profiler 工具窗口中的进程时,会打开一个菜单

打开外部线程转储文件

  1. 在主菜单中,前往 代码 | 分析堆栈跟踪或线程转储

  2. 分析堆栈跟踪 对话框打开后,将线程转储粘贴到 请在此处放置堆栈跟踪或完整的线程转储: 文本区域中。

线程转储将在新的工具窗口标签页中打开。该视图可自定义:您可以应用筛选和排序,合并相似线程,并对堆栈跟踪部分折叠。 此视图是可自定义的:您可以应用筛选和排序,合并相似的线程,并部分折叠堆栈跟踪。

线程名称旁的图标表示线程状态:

图标

描述

运行/活动 —— 默认状态,线程正在主动执行代码

(用于 Kotlin 协程)运行 —— 协程正在主动执行代码

休眠 —— 当线程处于 Thread.sleep ,或线程正在 park 或等待条件时出现

载体线程 —— 当前正在执行虚拟线程的平台线程,或处于 已创建/未知状态的协程

等待 —— 线程正在等待对象监视器,或协程已挂起时出现

Socket —— 线程正在执行网络 I/O 操作时出现

I/O —— 线程正在执行非网络 I/O 操作时出现

EDT(事件分发线程)—— Swing 应用程序中的 UI 线程。 表示空闲 EDT, 表示活跃状态。

此外,波浪形的叠加层表示虚拟线程和 Kotlin 协程,而“幽灵”叠加层表示守护线程:

线程转储中指示虚拟线程和守护线程的叠加层

运行 工具窗口中的某些调用具有虚线下划线。 这些调用发生在 try 块内,可能会抛出受检异常。

如果您想检查出现在堆栈跟踪中的类,您可以直接从线程转储导航到它。

跳转到源

  • 点击堆栈跟踪中的超链接。

    线程转储中的超链接

如果您想保存线程转储以供以后检查或发送给其他人,您可以将其导出为文本文件。

将线程转储导出为文本文件

  1. 在工具栏中,点击 导出到文本文件

    在线程转储查看器中导出到文本文件按钮
  2. 指定路径,然后点击 保存

IntelliJ IDEA 线程转储文件格式

以文本格式查看 IntelliJ IDEA 的线程转储时,您可能会注意到线程描述和堆栈跟踪中有其他信息。

以下是其外观示例:

"main" prio=5 tid=0x000001f3c9d13000 nid=NA runnable java.lang.Thread.State: RUNNABLE at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) at java.net.SocketInputStream.read(SocketInputStream.java:171) at java.net.SocketInputStream.read(SocketInputStream.java:141) at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) - locked <0x00000007ab1d3fa8> (a java.io.InputStreamReader) at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)

转储中的每个线程都包含以下信息:

线程信息页眉行

"Thread-Name" [state flags] prio=N tid=0xHEXVALUE nid=NA [thread state]

线程信息页眉行为每个线程描述的首行,并包含:

  • 带引号的线程名称

  • 用于指示线程是否为守护线程或虚拟线程的可选标志

  • 线程优先级(prio)—— 由 JVM 管理的值,表示线程的调度优先级,值的范围从 1(最低)到 10(最高)。 默认值是 5。 这些优先级可能会映射到操作系统级别的线程优先级,但该映射取决于具体实现,且优先级只是调度器的提示,不保证实际执行顺序。

  • 十六进制格式的线程 ID(tid

  • 本地 ID(nid)—— 在 IDE 生成的转储文件中通常为 NA。 该信息通常仅在线程转储由 JVM 自身生成时可用。

  • 线程状态。 可识别下列状态:

    线程状态

    描述

    runnable

    线程正处于活动运行或准备运行状态

    sleeping

    线程处于休眠状态(Thread.sleep()

    waiting on condition

    线程正在等待条件

    waiting for monitor entry

    线程正在等待获取监视器锁

    sleeping

    线程处于休眠状态(Thread.sleep()

    parking

    线程已挂起(LockSupport.park()

    on object monitor

    线程正在等待对象监视器

    idle

    事件分发线程处于空闲状态

线程状态行

线程状态行紧跟在线程信息页眉行之后,并包含由 JVM 指示的线程状态。 可能的状态有:

线程状态

描述

NEW

尚未开始执行的线程

RUNNABLE

正在 Java 虚拟机中执行的线程

BLOCKED

因等待监视器锁被阻塞的线程

WAITING

无限期等待其他线程完成特定操作的线程

TIMED_WAITING

在指定等待时间内等待其他线程完成某一操作的线程

TERMINATED

已结束执行的线程

有关线程状态的更多信息,请参阅 官方 Java 文档

堆栈跟踪

堆栈跟踪显示了线程方法调用的顺序,特征如下:

  • 堆栈跟踪中的每一行都以制表符开始。

  • 方法调用按从上到下排列(顶部为最近/被调用方法,底部为较早/调用方法)。

  • 每一行格式如下: at package.class.method(SourceFile:LineNumber)。 当 IntelliJ IDEA 识别到源文件时,可以用它 跳转到源代码

锁信息

当提供时,IntelliJ IDEA 的线程转储会显示线程持有的锁的信息,包括:

  • 该线程拥有的监视器

  • 被该线程阻塞的线程

  • 该线程正在等待的监视器

  • 锁对象及其类和内存地址

Kotlin 协程

您可以在 IntelliJ IDEA 的线程转储中与 Java 线程一起查看 Kotlin 协程。 例如:

"coroutine:2" SUSPENDED at kotlinx.coroutines.DelayKt.awaitCancellation(Delay.kt:157) at NetworkServiceKt.fetchData(NetworkService.kt:15) at MainKt$main$1.invokeSuspend(Main.kt:11) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)

协程信息的格式如下:

"CoroutineName:id" (state) [dispatcher] <coroutine descriptor> <stack trace>
  • 名称和 ID:协程名称后跟其唯一 ID,例如 coroutine:1

  • 状态:协程当前状态,例如 暂停

  • 调度器:协程使用的调度器信息,例如 Dispatchers.IO

  • 堆栈跟踪:协程的堆栈帧

协程可处于以下状态之一:

协程状态

描述

运行中

协程当前正在执行

暂停

协程在挂起点已挂起

创建

协程已创建但尚未启动

UNKNOWN

无法确定该状态

2026年 1月 23日