死锁指的是两个或多个计算单元(流程,线程或公司),他们正在等待对方停止执行以获取系统资源,但没有事先退出,这称为僵局。
接下来,让我们演示Java中最简单的僵局。我们创建两个锁和两个线程,以便线程1先锁定A锁定,然后尝试在1之后获得锁定B。IT首先具有锁定B,然后尝试在1s之后获得锁定。目前,它将等待另一方释放锁。
上述程序的执行结果如下:
从上面的结果可以看出,线程1和线程2正在等待另一方释放锁,这会导致死锁的问题。
通过上述示例,我们可以得出结论,需要满足以下四个条件才能产生死锁:
只有同时满足上述四个条件时,才能引起死亡问题。
如果该程序有死锁问题,则可以通过以下4个方案中的任何一个分析和调查分析和调查。
在使用JSTACK之前,我们必须通过JPS获得运行程序的流程ID。使用方法如下:
“ JPS -L”可以查询该计算机的所有Java程序。JPS(Java Virtual Machine过程状态工具)是一个命令,显示Java提供的所有当前Java Process PID。该过程的某些简单情况“ -l”用于输出PID的过程并运行整个路径(软件包名称和班级名称)。
使用过程ID(PID),我们可以使用“ JSTACK -L PID”来发现死锁的问题,如下图所示:
JSTACK用于生成Java虚拟机当前矩的线程快照。
PS:您可以使用JSTACK -HELP查看更多命令说明。
使用JConsole需要打开JDK bin目录,找到JConsole并双击以打开它,如下图所示:
然后选择要调试的程序,如下图所示:
然后单击输入的连接,选择“不安全连接”以输入监视主页,如下图所示:
然后切换到“线程”模块,单击“检测死锁”按钮,如下图所示:
一段时间后,将检测到僵局的相关信息,如下图所示:
JVisualVM也在JDK bin目录中,并且还可以打开双击:
几秒钟后,所有本地Java程序将出现在JVisualVM中,如下图所示:
双击选择要调试的程序:
单基机鼠标进入“线程”模块,如下图所示:
从上图可以看出,当我们切换到线程列时,将直接显示僵局信息,然后单击“线程转储”以生成僵局的详细信息,如下图所示:
JMC是Oracle Java任务控制的缩写。它是一个工具套件,用于管理,监视,汇总和故障调查Java程序。它也位于JDK的bin目录中,该目录也是启动的双击,如下图所示:
JMC主页信息如下:
之后,选择要检查的程序,右键单击“启动JMX控制台”以查看该程序的详细内容,如下图所示:
然后单击“线程”以查找僵局中的僵局和僵局的详细信息,如下图所示:
死锁是因为两个或多个计算单元正在等待对方停止执行以获取系统资源,但没有事先退出,因此出现僵局。有4种用于死锁的检查工具:
就易于使用和性能而言,建议使用JConsole或JvisualVM检查死锁。
作者:爪哇中国社区