线程转储
线程转储是一种用于检查应用程序在特定瞬间状态的工具。 它们提供了应用程序中线程及其堆栈跟踪的列表,可用于调试死锁或无响应 UI 等问题。 线程转储的主要优点是它们使用纯文本格式,并且有大量工具可以捕获和处理它们。
IntelliJ IDEA 允许你为正在运行的进程捕获线程转储,并解释在 IntelliJ IDEA 或其他工具(如 jstack 和 jcmd )中获取的外部线程转储。
IntelliJ IDEA 支持由 JDK 工具生成的格式,最高可达版本 25。
从 IntelliJ IDEA 捕获线程转储
从 IntelliJ IDEA 运行程序时:在 运行 工具窗口的工具栏中,点击
转储线程。

从 IntelliJ IDEA 调试程序时:在 调试 工具窗口的工具栏中,点击
更多 ,然后选择
获取线程转储。

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

打开外部线程转储文件
在 分析堆栈跟踪 对话框打开后,将线程转储粘贴到 请在此处放置堆栈跟踪或完整的线程转储: 文本区域中。
线程转储将在新的工具窗口标签页中打开。该视图可自定义:您可以应用筛选和排序,合并相似线程,并对堆栈跟踪部分折叠。 此视图是可自定义的:您可以应用筛选和排序,合并相似的线程,并部分折叠堆栈跟踪。
线程名称旁的图标表示线程状态:
图标 | 描述 |
|---|---|
运行/活动 —— 默认状态,线程正在主动执行代码 | |
(用于 Kotlin 协程)运行 —— 协程正在主动执行代码 | |
休眠 —— 当线程处于 | |
载体线程 —— 当前正在执行虚拟线程的平台线程,或处于 已创建/未知状态的协程 | |
| 等待 —— 线程正在等待对象监视器,或协程已挂起时出现 |
Socket —— 线程正在执行网络 I/O 操作时出现 | |
I/O —— 线程正在执行非网络 I/O 操作时出现 | |
| EDT(事件分发线程)—— Swing 应用程序中的 UI 线程。 |
此外,波浪形的叠加层表示虚拟线程和 Kotlin 协程,而“幽灵”叠加层表示守护线程:

在 运行 工具窗口中的某些调用具有虚线下划线。 这些调用发生在 try 块内,可能会抛出受检异常。
如果您想检查出现在堆栈跟踪中的类,您可以直接从线程转储导航到它。
跳转到源
点击堆栈跟踪中的超链接。

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

指定路径,然后点击 保存。
IntelliJ IDEA 线程转储文件格式
以文本格式查看 IntelliJ IDEA 的线程转储时,您可能会注意到线程描述和堆栈跟踪中有其他信息。
以下是其外观示例:
转储中的每个线程都包含以下信息:
线程信息页眉行
线程信息页眉行为每个线程描述的首行,并包含:
带引号的线程名称
用于指示线程是否为守护线程或虚拟线程的可选标志
线程优先级(
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 指示的线程状态。 可能的状态有:
线程状态 | 描述 |
|---|---|
| 尚未开始执行的线程 |
| 正在 Java 虚拟机中执行的线程 |
| 因等待监视器锁被阻塞的线程 |
| 无限期等待其他线程完成特定操作的线程 |
| 在指定等待时间内等待其他线程完成某一操作的线程 |
| 已结束执行的线程 |
有关线程状态的更多信息,请参阅 官方 Java 文档。
堆栈跟踪
堆栈跟踪显示了线程方法调用的顺序,特征如下:
堆栈跟踪中的每一行都以制表符开始。
方法调用按从上到下排列(顶部为最近/被调用方法,底部为较早/调用方法)。
每一行格式如下:
at package.class.method(SourceFile:LineNumber)。 当 IntelliJ IDEA 识别到源文件时,可以用它 跳转到源代码。
锁信息
当提供时,IntelliJ IDEA 的线程转储会显示线程持有的锁的信息,包括:
该线程拥有的监视器
被该线程阻塞的线程
该线程正在等待的监视器
锁对象及其类和内存地址
Kotlin 协程
您可以在 IntelliJ IDEA 的线程转储中与 Java 线程一起查看 Kotlin 协程。 例如:
协程信息的格式如下:
名称和 ID:协程名称后跟其唯一 ID,例如
coroutine:1状态:协程当前状态,例如
暂停调度器:协程使用的调度器信息,例如
Dispatchers.IO堆栈跟踪:协程的堆栈帧
协程可处于以下状态之一:
协程状态 | 描述 |
|---|---|
| 协程当前正在执行 |
| 协程在挂起点已挂起 |
| 协程已创建但尚未启动 |
| 无法确定该状态 |