当IDE卡住或无响应时获取线程堆栈
线程堆栈可以帮助在IDE 锁死且用户界面无响应时定位 IDE 的性能问题。
只有当 IDE 无响应的时候才应该获取和记录线程堆栈。 以1到2秒的间隔来获取多个线程堆栈对于问题分析也会很有帮助。
自动线程堆栈
IDE中运行一个特殊的线程,这个线程会检测界面的锁定超过一定时间后,会自动获取线程堆栈并存储到 日志目录中。你可以在日志目录找到若干名字类似于 threadDumps-freeze-20221117-095348-IU-222.4345.14-5sec 的文件夹。请将这些文件夹和日志文件一起压缩为Zip文件并上传到你的问题报告中。
如果没有生成自动线程堆栈(例如当整个IDE进程完全卡住时),则需要手动抓取线程堆栈:
jstack
此命令行工具是随 JDK 安装包提供的,可以在 JAVA_HOME\bin 或者在 <ide安装路径>/jbr/bin目录下找到 (内置于IDE 2021.1或更高版本)。如果你使用的是Toolbox App,请参阅 这篇 关于<ide_安装路径> 的文章。
请确保使用于运行 IDE的 JDK 版本相同或者接近的 JDK 版本(要在”关于“ 对话框中 查看 JDK 版本,请连按两次Shift键,输入'About',然后按下回车键)。如果使用IDE 运行的是32位 JDK而你使用64位 JDK安装路径下的 jstack,将无法正常获取堆栈,反之亦然(32位 JDK 获取64位 JDK 进程的堆栈)。
使用 jstack 之前,你需要获取 IDE 的进程 ID(PID)。PID可以使用jstack相同目录下的 jps 工具来获取。
jps -mv
此命令会列出系统上运行的所有 Java 进程及其命令行选项。 根据这些信息找到 IDE 所属进程并记下它的 PID。
jstack -l <PID>
对IDE PID运行 jstack 会将线程堆栈都输出到控制台,然而这并不是很方便。请使用这个命令将输出内容重定向到一个文件:
jstack -l <PID> > dump.txt
要获取若干个线程堆栈,请重复此命令但需要修改不同的重定向文件名,例如 dump1.txt, dump2.txt等。
从命令行获取线程堆栈
如果 jstack 无法正常工作,可以尝试从命令行或终端来启动 IDE 并使用平台相关的方式来获取线程堆栈。
Windows
运行使用 IDE_安装路径\bin 目录下的以产品命名的 .bat文件(idea.bat, phpstorm.bat, webstorm.bat, pycharm.bat, rubymine,bat等)。
在命令行窗口按下 Ctrl+Break(而不是 Ctrl+C)来获取线程堆栈。由于线程堆栈会很长,建议使用重定向的方式来启动 IDE,例如下面的命令:
idea.bat > output.txt 2>&1
你可以通过多次按Ctrl + Break将若干转储堆栈输出到同一文件中。
macOS X
在访达(Finder)打开可执行文件 /Applications/<PRODUCT>.app/Contents/MacOS/<product> ,在右键菜单中选择在终端中打开。在终端窗口中按下 Ctrl+\ 组合键来获取线程堆栈。
Linux, Solaris, 通用 Unix
在终端中使用产品 bin 目录下的.sh 脚本来启动 IDE。再打开一个新终端窗口,使用jps,ps 或者你喜欢的进程管理器来获取 IDE的Java 进程 ID。向 IDE 进程发送 QUIT 信号:
kill -QUIT <PID>
线程堆栈会输出到第一个运行 IDE 的终端窗口中。使用进程输出重定向文件的方式来获取长线程堆栈。
请登录写评论。