研究僵局–第2部分

调查死锁时最重要的要求之一就是要研究死锁。 在我的上一个博客中,我编写了一个名为DeadlockDemo代码,该代码使用一堆线程在一系列银行帐户之间转移随机数,然后陷入僵局。

该博客运行该代码以演示获取线程转储的几种方法。 线程转储只是一个报告,显示给定时间点所有应用程序线程的状态。 这样做的好处是,它包含各种信息,可以让您弄清楚为什么会出现死锁,并希望可以解决此问题,但稍后会介绍更多。

杀死SIGQUIT

如果Java应用程序在UNIX计算机上运行,​​则抢占线程转储的第一种方法(可能是最简单的方法)是通过终端使用UNIX kill命令。

为此,请先使用psgrep命令掌握应用程序的进程标识符或PID。 例如,如果您键入:

ps –e | grep java

…然后您将生成一个类似于以下内容的列表:

74941 ttys000    0:00.01 grep java
70201 ttys004    1:00.89 /usr/bin/java threads.deadlock.DeadlockDemo

在这种情况下, DeadlockDemo的PID是70201,它是从上面的输出中获取的。 请注意,不同类型的UNIX或不同的ps命令行参数可能会产生略有不同的结果,因此请检查man页。

掌握了PID之后,使用它发出kill SIGQUIT命令:

kill -3 70201

kill命令是UNIX命令,用于处理不需要的进程

尽管上面的-3是SIGQUIT(等效于键盘ctrl-D)参数,但是,如果Java收到此信号,它将不会退出,它将在其关联的终端上显示线程转储。 然后,您可以抓住它并将其复制到文本文件中以进行进一步分析。

jstack

如果您使用Windows,则UNIX命令行不可用。 为了解决这个问题,Java附带了一个执行kill等效功能的实用程序。 这称为jstack ,在UNIX和Windows上均可用。 它的用法与上面演示的kill命令相同:

jstack <PID>

在Windows中获取PID是打开Windows任务管理器的问题。 任务管理器默认情况下不显示PID,因此您需要使用view菜单选项并在“ 选择列”对话框中选中“ PID(过程标识符)”选项来更新其设置。

接下来,只需检查进程列表并找到合适的java.exe实例即可。

读取java.exe的PID并将其用作jstack参数,如下所示:

jstack 3492

命令完成后,您可以保留输出并将其复制到文本文件中以进行进一步分析。

jVisualVM

jVisualVM是获取线程转储的“ Rolls Royce”方法。 它是Oracle提供的工具,使您可以掌握有关Java VM的许多不同信息。 这包括堆转储,CPU使用率,内存配置文件等等。

在Windows上,jVisualVM的实际程序名称是jvisualvmjvisualvm.exe 。 运行后,您将看到以下内容:

要获取线程转储,请在左侧的应用程序面板中找到您的应用程序 ,然后右键单击并选择:“ Thread Dump”。

然后在jvisualvm的右侧窗格中显示一个线程转储,如下所示:

请注意,在连接到本地VM时,我多次看到jvisualvm挂起。 发生这种情况时,请确保将其代理设置设置为“ 无代理”

获得了线程转储后,我的下一个博客现在将使用它来研究示例DeadlockDemo代码的问题所在。

有关更多信息,请参阅本系列中的其他博客

参考: 调查死锁-第2部分:Captain Debug的Blog博客上从JCG合作伙伴 Roger Hughes 获得线程转储

翻译自: https://www.javacodegeeks.com/2012/10/investigating-deadlocks-part-2.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值