线程转储是某个时刻正在执行的所有线程的快照。 它显示了每个线程的堆栈跟踪,它们所获得的锁,它们正在等待的锁,它们的优先级,每个空间当前的Java内存利用率...简而言之,这是诊断Java内存,CPU相关问题的重要工具。



这是捕获线程转储的方式:

第1步:确定流程ID

首先,您需要标识Java进程ID,您需要为其捕获线程转储。 为此,可以使用JDK附带的“ jps”(JVM进程状态)工具。 该工具列出了在目标系统上运行的所有Java进程及其进程ID。



jps



下面是执行此命令的示例输出:



30548 org.eclipse.equinox.launcher_1.3.0.v20140415-2008.jar 36292 Jps 37320 AddressBook



每行的第一个字段是进程ID,第二个字段是正在运行的Java程序的名称。 按照上面的示例,“ 37320”是地址簿程序的进程ID。

或者,如果您在* nix操作系统上运行,则还可以发出“ ps”(进程状态)命令和Java进程的grep。 例:



ps -ef | grep 'java'



步骤2.a:在* nix中捕获线程转储

“ jstack”是捕获线程转储的有效工具。 Jstack附带了jstack工具。 这是您需要发出以捕获线程转储的命令:



jstack -l <pid> > <file-path>



哪里
pid:是Java进程ID,应捕获其线程转储
file-path:是将写入线程转储的文件路径。

例:



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



AddressBook-threadDump.txt文件中生成线程转储。

出于安全原因,我已经在大型企业中看到只有JRE安装在生产机器中。 由于jstack是JDK的一部分,因此您将无法使用jstack工具。 在这种情况下,可以使用“ kill -3”选项。



kill -3



使用'kill -3'选项时,线程转储将发送到标准错误流。

步骤2.b:在Windows上捕获线程转储

即使JDK附带了“ jstack”,在Windows中也无法正常运行。 因此,建议在Windows计算机上生成线程转储的方法是使用“ jvisualvm”工具。 该工具也随JDK一起提供。 步骤如下:

一个。 启动Visual VM工具

jvisualvm.exe

b。 选择你的应用

启动jvisualvm后,在左侧面板上,您会注意到计算机上正在运行的所有Java应用程序。 您需要从列表中选择您的应用程序



翻译自: https://www.theserverside.com/blog/Coffee-Talk-Java-News-Stories-and-Opinions/HOW-TO-CAPTURE-THREAD-DUMP-JSTACK-JVISUALVM