在IDEA内部,进行更高效的死锁调试

本文是对OO第二单元总结的一部分。

前言

oolens最近发的多线程文章中介绍了两套调试工具,但个人认为二者功能相互独立,且二者使用起来都不大方便。这两个工具还是太吃操作了,有没有什么更简单又强势的工具推荐一下呢?

有的兄弟,有的! 使用IDEA本身就够了!我们主要利用的,是它的Dump Threads(获取线程转储)功能。

基础操作

这个Community版本也能用,没搞到Ultimate版的同学不用担心。

在你使用IDEA运行程序的时候,你是否好奇过,这个照相机是个什么玩意?这其实就是我们今天的主角Dump Threads了。

Screenshot 2025-03-30 233738.png

直接左键选中,会进入一个菜单。这个选项可以抓取当前时刻程序运行状态的快照,记录了当前程序下所有线程:

  • 是否等待
  • 等待类型
  • 在代码运行到何处等待
  • 调用栈
    等详尽的信息,为我们的调试带来了极大的便利。

Pasted image 20250330234106.png

直接点开超链接,甚至可以直接定位到代码处:

Pasted image 20250330234144.png

妈妈再也不用担心我找不到死锁了!

Debug处也有这个入口,在更多选项里:

Screenshot 2025-03-30 235054.png

要这么做有一个局限性,就是当前程序必须在IDEA内运行,可能需要配合更好用的数据投喂器使用。当然,如果能用下面提到的方法,这个局限就不存在。

更进一步 - 使用IDEA Profiler

(需要IDEA Ultimate,如果手上没有,获取方法还请自行探索 :D)

显然,我们一般跑程序,不可能全部放在IDEA里面跑;有没有什么像oolens里介绍的工具一样,找出当前运行的所有Java程序,并选取要分析的程序进行分析的方法呢?

是有的,要用到IDEA Profiler。就是上个单元,我们分析运行时间接触到的那个IDEA Profiler。 他除了分析运行时间以外,还可以查看选中进程的运行状态。

要打开它,我们需要点开菜单栏中这个仪表盘图标:
Screenshot 2025-03-30 231301.png

点开之后,菜单里会列出正在运行的所有Java程序。如果我们此时的程序正在运行的话,我们可以在下面的选单里找到我们的程序:

Screenshot 2025-03-30 231405.png

随后直接左键选中,发现里面有个选项叫”Get Thread Dump”,跟我们上面的Dump Threads得到的效果是一样的。

Screenshot 2025-03-30 231410.png

Pasted image 20250330232124.png

如果我们此时拥有上述调用的源码,我们一样可以点开超链接,直接定位到代码对应位置;没有的话,IDEA甚至会帮你反编译:
Pasted image 20250330232231.png

整体效果跟oolens提到的jconsole基本一致,甚至比它还好用。

结语

没什么好总结的,大家手上有IDEA的快去试试吧!:D

作者

LajiPZ

发布于

2025-04-17

更新于

2025-04-21

许可协议

评论