性能文章>介绍8个获取线程dump文件的方法>

介绍8个获取线程dump文件的方法转载

1月前
199723

线程转储是诊断 CPU 峰值、死锁、响应时间差、内存问题、无响应应用程序和其他系统问题的重要工件。

在线线程转储分析工具满多,例如http://fastthread.io/,可以分析和发现问题。

但是对于这些工具,您需要提供dump文件作为输入。因此,在本文中,我记录了 8 个捕获线程dump文件的方法。

1.jstack

'jstack' 是捕获线程转储的有效命令行工具。jstack 工具包含在 JDK_HOMEbin 文件夹中。这是您需要发出以捕获线程转储的命令:

jstack -l   <​​pid> > <文件路径>

在哪里

pid:是应用程序的进程ID,应捕获其线程转储

file-path:是写入线程转储的文件路径。

例子:

jstack -l  37320 > /opt/tmp/threadDump.txt

根据示例,进程的线程转储将在 /opt/tmp/threadDump.txt 文件中生成。

Jstack 工具自 Java 5 起包含在 JDK 中。如果您在旧版本的 java 中运行,请考虑使用其他选项

2.kill-3

在主要企业中,出于安全原因,只有 JRE 安装在生产机器上。由于 jstack 和其他工具只是 JDK 的一部分,因此您将无法使用 jstack 工具。在这种情况下,可以使用“kill -3”选项。

kill -3 <pid>

在哪里

pid:是应用程序的进程ID,应捕获其线程转储

例子:

kill-3  37320
 

当使用 'kill -3' 选项时,线程转储被发送到标准错误流。如果您在 tomcat 中运行应用程序,线程转储将被发送到 <TOMCAT_HOME>/logs/catalina.out 文件中。

注意:据我所知,大多数 *nix 操作系统(Unix、Linux、HP-UX 操作系统)都支持此选项。不确定其他操作系统。

3. JVisualVM

Java VisualVM 是一种图形用户界面工具,可在应用程序在指定的 Java 虚拟机 (JVM) 上运行时提供有关应用程序的详细信息。它位于 JDK_HOMEbinjvisualvm.exe 中。它是自 JDK 6 更新 7.s 以来 Sun 的 JDK 发行版的一部分

启动 jvisualvm。在左侧面板上,您会注意到在您的机器上运行的所有 Java 应用程序。您需要从列表中选择您的应用程序(请参见下图中的红色突出显示)。该工具还能够从远程主机上运行的 java 进程中捕获线程转储。

图:Java 视觉虚拟机图:Java 视觉虚拟机

现在转到“线程”选项卡。单击“线程转储”按钮,如下图所示。现在将生成线程转储。

图片标题图:突出显示“线程”选项卡中的“线程转储”按钮

4.JMC

Java Mission Control (JMC) 是一种从本地运行或部署在生产环境中的 Java 应用程序收集和分析数据的工具。自 Oracle JDK 7 Update 40 以来,该工具已被打包到 JDK 中。该工具还提供了从 JVM 获取线程转储的选项。JMC 工具存在于JDK_HOMEbinjmc.exe中

启动该工具后,您将看到在本地主机上运行的所有 Java 进程。注意:JMC 也可以连接远程主机上运行的 java 进程。现在在左侧面板上单击“Flight Recorder”选项,该选项列在要为其进行线程转储的 Java 进程下方。现在您将看到“开始飞行记录”向导,如下图所示。

图片标题图:飞行记录器向导显示“线程转储”捕获选项。

在“线程转储”字段中,您可以选择要捕获线程转储的时间间隔。根据上面的示例,每 60 秒将捕获一次线程转储。选择完成后启动飞行记录器。录制完成后,您将在“线程”面板中看到线程转储,如下图所示。

图片标题图:在 JMC 中显示捕获的“线程转储”。

5. Ctrl + Break

此选项仅适用于 Windows 操作系统。

  • 选择您已在其中启动应用程序的命令行控制台窗口。
  • 现在在控制台窗口上发出“ Ctrl + Break ”命令。

这将生成线程转储。线程转储将打印在控制台窗口本身上。

注 1:在几款笔记本电脑(比如我的联想 T 系列)中,“Break”键被移除了J。在这种情况下,您必须谷歌搜索“Break”的等效键。就我而言,事实证明“功能键 + B”相当于“中断”键。因此我不得不使用“Ctrl + Fn + B”来生成thread dump.s

注意 2:但该方法的一个缺点是线程转储将打印在 Windows 控制台本身上。如果没有获取文件格式的线程转储,很难使用http://fastthread.io等线程转储分析工具。因此,当您从命令行启动应用程序时,将输出重定向到一个文本文件,即示例,如果您正在启动应用程序“SampleThreadProgram”,您将发出以下命令:

java -类路径。SampleThreadProgram
 

相反,像这样启动 SampleThreadProgram

java -类路径。SampleThreadProgram > C:workspacethreadDump.txt 2 >&1
 

因此,当您发出“Ctrl + Break”时,线程转储将发送到C:workspacethreadDump.txt文件。

6. ThreadMXBean

从 JDK 1.5 开始引入了 ThreadMXBean。这是Java虚拟机中线程系统的管理接口。使用此接口,您还可以生成线程转储。您只需编写几行代码即可以编程方式生成线程转储。下面是 ThreadMXBean 实现的骨架实现,它从应用程序生成线程转储。

    公共无效转储线程转储(){
        ThreadMXBean threadMxBean = ManagementFactory.getThreadMXBean();
        for (ThreadInfo ti : threadMxBean.dumpAllThreads(true, true)) {
            System.out.print(ti.toString());
        }
    }

7. APM 工具 

很少有应用程序性能监控工具提供生成线程转储的选项。如果您通过 App Dynamics(APM 工具)监控您的应用程序,以下是捕获线程转储的说明:

1. 创建一个动作,在 Create Action 窗口中选择Diagnostics->Take a thread dump 。
2. 输入操作的名称、要采集的样本数以及线程转储之间的时间间隔(以毫秒为单位)。
3. 如果您希望在启动线程转储操作之前需要批准,请选中在此操作之前需要批准复选框并输入有权批准该操作的个人或组的电子邮件地址。有关详细信息,请参阅需要批准的操作。
4. 单击确定

图片标题图:App 动态线程转储捕获向导

8. JCMD

jcmd 工具是在 Oracle 的 Java 7 中引入的。它对于解决 JVM 应用程序的问题很有用。它具有各种功能,例如识别 Java 进程 ID、获取堆转储、获取线程转储、获取垃圾收集统计信息……。

使用下面的 JCMD 命令可以生成线程转储:

jcmd <pid> Thread.print > <文件路径>

在那里

pid:是应用程序的进程ID,应捕获其线程转储

file-path:是写入线程转储的文件路径。

例子:

jcmd 37320 Thread.print > /opt/tmp/threadDump.txt

根据示例,进程的线程转储将在 /opt/tmp/threadDump.txt 文件中生成。

结论

尽管列出了 8 个不同的选项来捕获线程转储,但是1. 'jstack' 和 2. 'kill -3' 和 8. 'jcmd' 是最好的。

因为他们:

简单(简单明了,易于实现)

通用(尽管有操作系统、Java 供应商、JVM 版本,但在大多数情况下都可以工作……)

点赞收藏
willberthos

keep foolish!

请先登录,查看2条精彩评论吧
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步

为你推荐

聊聊 Netty 那些事儿之从内核角度看 IO 模型

聊聊 Netty 那些事儿之从内核角度看 IO 模型

线程池,我是谁?我在哪儿?

线程池,我是谁?我在哪儿?

代码改成多线程,竟有9大问题

代码改成多线程,竟有9大问题

面试必备!多线程硬核50问!

面试必备!多线程硬核50问!

【译】一个Java UUID生成导致的性能问题和解决方案

【译】一个Java UUID生成导致的性能问题和解决方案

聊聊动态线程池的9个场景

聊聊动态线程池的9个场景

3
2