线程转储是诊断CPU尖峰,死锁,内存问题,无响应的应用程序,较差的响应时间以及其他系统问题的重要工件。
有很多很棒的在线线程转储分析工具,可以分析和发现问题。但是对于那些工具,您需要提供适当的线程转储作为输入。因此,在本文中,我记录了7种不同的选项来捕获线程转储。
1. jstack
“ jstack”是捕获线程转储的有效命令行工具。jstack工具位于JDK_HOME bin文件夹中。这是捕获线程转储所需发出的命令:
jstack -l <pid> > <file-path>
哪里:
pid:是应用程序的进程ID,应捕获其线程转储
file-path:是将写入线程转储的文件路径。
例:
jstack -l 37320 > /opt/tmp/threadDump.txt
按照示例,该过程的线程转储将在/opt/tmp/threadDump.txt文件中生成。
自Java 5以来,JDK中已包含Jstack工具。如果您在旧版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_HOME bin jvisualvm.exe中。自JDK 6更新7.s起,它是Sun JDK发行版的一部分。
启动jvisualvm。在左侧面板上,您会注意到计算机上正在运行的所有Java应用程序。您需要从列表中选择您的应用程序。该工具还具有从远程主机上运行的Java进程中捕获线程转储的功能。
4.Java Mission Control
Java Mission Control(JMC)是一种工具,可从本地运行或部署在生产环境中的Java应用程序收集和分析数据。自Oracle JDK 7 Update 40起,该工具已打包到JDK中。该工具还提供了从JVM进行线程转储的选项。JDK_HOME bin jmc.exe中存在JMC工具
启动该工具后,您将看到本地主机上正在运行的所有Java进程。注意:JMC还具有与远程主机上运行的Java进程连接的能力。现在,在左侧面板上,单击要进行线程转储的Java进程下方列出的“ Flight Recorder”选项。
5. Windows(按Ctrl + Break)
此选项仅在Windows操作系统中有效。
· 选择已启动应用程序的命令行控制台窗口。
· 现在,在控制台窗口上,发出“ Ctrl + Break ”命令。
这将生成线程转储。线程转储将被打印在控制台窗口本身上。
注1:在几台笔记本电脑(例如我的Lenovo T系列)中,“ Break”键被拔下。在这种情况下,您必须在Google上找到“ Break”的等效键。在我的情况下,事实证明“功能键+ B”等效于“断裂”键。因此,我不得不使用“ Ctrl + Fn + B”来生成线程转储。
注意2:但是这种方法的一个缺点是线程转储将打印在Windows控制台本身上。如果不以文件格式获取线程转储,则很难使用线程转储分析工具(例如http://fasthread.io)。因此,当您从命令行启动应用程序时,将输出重定向到文本文件,即示例,如果您正在启动应用程序“ SampleThreadProgram”,则将发出以下命令:
java -classpath . SampleThreadProgram
而是像这样启动SampleThreadProgram
java -classpath . SampleThreadProgram > C:workspacethreadDump.txt 2>&1
因此,当您发布“ Ctrl + Break”时,线程转储将发送到C: workspace threadDump.txt文件。
6. ThreadMXBean
从JDK 1.5开始,引入了ThreadMXBean。这是Java虚拟机中线程系统的管理接口。使用此接口,您还可以生成线程转储。您只需编写几行代码即可以编程方式生成线程转储。下面是ThreadMXBean实现的框架实现,该实现从应用程序生成Thread dump。
public void dumpThreadDump() {
ThreadMXBean threadMxBean = ManagementFactory.getThreadMXBean();
for (ThreadInfo ti : threadMxBean.dumpAllThreads(true, true)) {
System.out.print(ti.toString());
}
}
7. APM工具– App Dynamics
很少有应用程序性能监视工具提供生成线程转储的选项。如果要通过App Dynamics(APM工具)监视应用程序,则以下是捕获线程转储的说明:
1.创建一个动作,在“创建动作”窗口中选择“ 诊断”->“执行线程转储 ”。
2.输入操作名称,要采样的数量以及线程转储之间的间隔(以毫秒为单位)。
3.如果要在启动线程转储操作之前需要批准,请选中“在此操作之前需要批准”复选框,然后输入被授权批准该操作的个人或组的电子邮件地址。有关更多信息,请参见需要批准的操作。
4.单击确定。
8. JCMD
jcmd工具是随Oracle Java 7引入的。它对解决JVM应用程序的问题很有用。它具有多种功能,例如,识别Java进程ID,获取堆转储,获取线程转储,获取垃圾收集统计信息等等。
使用以下JCMD命令,可以生成线程转储:
jcmd <pid> Thread.print > <file-path>
哪里
pid: 是应用程序的进程ID,应捕获其线程转储
file-path: 是将写入线程转储的文件路径。
例:
jcmd 37320 Thread.print > /opt/tmp/threadDump.txt
按照示例,该过程的线程转储将在/opt/tmp/threadDump.txt文件中生成。
结论
即使列出了7个不同的选项来捕获线程转储,恕我直言,最好还是使用1.'jstack'和2.'kill -3'。因为他们是:
一种。简单(直接,易于实现)
b。通用(在大多数情况下均可运行,与操作系统,Java供应商,JVM版本等无关)