网站建设需要什么技能,零基础家装设计师自学,wordpress伪原创词库,网页设计师的能力调查死锁时最重要的要求之一就是要研究死锁。 在我的上一个博客中#xff0c;我编写了一个名为DeadlockDemo代码#xff0c;该代码使用一堆线程在一系列银行帐户之间转移随机数#xff0c;然后陷入僵局。 该博客运行该代码以演示获取线程转储的几种方法。 线程转储只是一个… 调查死锁时最重要的要求之一就是要研究死锁。 在我的上一个博客中我编写了一个名为DeadlockDemo代码该代码使用一堆线程在一系列银行帐户之间转移随机数然后陷入僵局。 该博客运行该代码以演示获取线程转储的几种方法。 线程转储只是一个报告显示给定时间点所有应用程序线程的状态。 这样做的好处是它包含各种信息可以让您弄清楚为什么会出现死锁并希望可以解决此问题但稍后会介绍更多。 杀死SIGQUIT 如果Java应用程序在UNIX计算机上运行则抢占线程转储的第一种方法可能是最简单的方法是通过终端使用UNIX kill命令。 为此请先使用ps和grep命令掌握应用程序的进程标识符或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的实际程序名称是jvisualvm或jvisualvm.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