线程转储是某个时刻正在执行的所有线程的快照。 它显示了每个线程的堆栈跟踪,它们所获得的锁,它们正在等待的锁,它们的优先级,每个空间当前的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应用程序。 您需要从列表中选择您的应用程序