- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章java排查死锁示例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
死锁(Dead Lock)指的是两个或两个以上的运算单元(进程、线程或协程),都在等待对方停止执行,以取得系统资源,但是没有一方提前退出,就称为死锁.
。
接下来,我们先来演示一下 Java 中最简单的死锁,我们创建两个锁和两个线程,让线程 1 先拥有锁 A,然后在 1s 后尝试获取锁 B,同时我们启动线程 2,让它先拥有锁 B,然后在 1s 之后尝试获取锁 A,这时就会出现相互等待对方释放锁的情况,从而造成死锁的问题,具体代码如下:
public class DeadLockExample { public static void main(String[] args) { Object lockA = new Object(); // 创建锁 A Object lockB = new Object(); // 创建锁 B // 创建线程 1 Thread t1 = new Thread(new Runnable() { @Override public void run() { // 先获取锁 A synchronized (lockA) { System.out.println("线程 1:获取到锁 A!"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } // 尝试获取锁 B System.out.println("线程 1:等待获取 B..."); synchronized (lockB) { System.out.println("线程 1:获取到锁 B!"); } } } }); t1.start(); // 运行线程 // 创建线程 2 Thread t2 = new Thread(new Runnable() { @Override public void run() { // 先获取锁 B synchronized (lockB) { System.out.println("线程 2:获取到锁 B!"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } // 尝试获取锁 A System.out.println("线程 2:等待获取 A..."); synchronized (lockA) { System.out.println("线程 2:获取到锁 A!"); } } } }); t2.start(); // 运行线程 }}
以上程序的执行结果如下:
从上述结果可以看出,线程 1 和线程 2 都在等待对方释放锁,这样就造成了死锁问题.
。
通过以上示例,我们可以得出结论,要产生死锁需要满足以下 4 个条件:
只有以上 4 个条件同时满足,才会造成死锁问题.
。
如果程序出现死锁问题,可通过以下 4 种方案中的任意一种进行分析和排查.
。
我们在使用 jstack 之前,先要通过 jps 得到运行程序的进程 ID,使用方法如下:
“jps -l”可以查询本机所有的 Java 程序,jps(Java Virtual Machine Process Status Tool)是 Java 提供的一个显示当前所有 Java 进程 pid 的命令,适合在 linux/unix/windows 平台上简单察看当前 Java 进程的一些简单情况,“-l”用于输出进程 pid 和运行程序完整路径名(包名和类名).
有了进程 ID(PID)之后,我们就可以使用“jstack -l PID”来发现死锁问题了,如下图所示:
jstack 用于生成 Java 虚拟机当前时刻的线程快照,“-l”表示长列表(long),打印关于锁的附加信息.
PS:可以使用 jstack -help 查看更多命令使用说明.
。
使用 jconsole 需要打开 JDK 的 bin 目录,找到 jconsole 并双击打开,如下图所示:
然后选择要调试的程序,如下图所示:
之后点击连接进入,选择“不安全的连接”进入监控主页,如下图所示:
之后切换到“线程”模块,点击“检测死锁”按钮,如下图所示:
之后稍等片刻就会检测出死锁的相关信息,如下图所示:
。
jvisualvm 也在 JDK 的 bin 目录中,同样是双击打开:
稍等几秒之后,jvisualvm 中就会出现本地的所有 Java 程序,如下图所示:
双击选择要调试的程序:
单机鼠标进入“线程”模块,如下图所示:
从上图可以看出,当我们切换到线程一栏之后就会直接显示出死锁信息,之后点击“线程 Dump”生成死锁的详情信息,如下图所示:
。
jmc 是 Oracle Java Mission Control 的缩写,是一个对 Java 程序进行管理、监控、概要分析和故障排查的工具套件。它也是在 JDK 的 bin 目录中,同样是双击启动,如下图所示:
jmc 主页信息如下:
之后选中要排查的程序,右键“启动 JMX 控制台”查看此程序的详细内容,如下图所示:
然后点击“线程”,勾中“死锁检测”就可以发现死锁和死锁的详情信息,如下图所示:
。
死锁是因为两个或两个以上的运算单元,都在等待对方停止执行,以取得系统资源,但没有一方提前退出,于是就出现了死锁。死锁的排查工具总共有 4 种:
从易用性和性能方面来考虑,推荐使用 jconsole 或 jvisualvm 来排查死锁.
参考 & 鸣谢 。
blog.csdn.net/u010648555/article/details/80721815 。
cnblogs.com/cxuanBlog/p/13202898.html 。
zh.wikipedia.org/zh-hans/死锁 。
以上就是java排查死锁示例的详细内容,更多关于java排查死锁的资料请关注我其它相关文章! 。
原文链接:https://www.cnblogs.com/vipstone/p/15178628.html 。
最后此篇关于java排查死锁示例的文章就讲到这里了,如果你想了解更多关于java排查死锁示例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我在 Microsoft Azure 中创建了一个新的 Windows Server 2012 R2 虚拟机。该虚拟机上安装的其他内容之一是 IIS 中托管的网站,但我似乎无法让该服务器上的 IIS
引用问题:: EJB weblogic.ejb20.cache.CacheFullException 我试图了解 EJB 容器如何管理实体 bean,我知道 EJBHome 对象上的 create/f
我刚刚继承了一个node.js 项目,我怀疑 Node 项目所需的一些原始样板尚未完成。这也是我第一次使用node.js。 无论如何,当我运行 node app.js 时,正确的端口会启动,但应用程序
我需要查看在 Azure 应用服务中运行的 .Net 应用程序的日志。 我在应用程序源代码中看到了许多我希望在 Application Insights 中看到的日志,但是,转到 Applicatio
我一直在使用 git 将我的本地代码推送到服务器。我有一个名为“origin”的本地 Remote ,我在服务器上有一个名为“github”的 Remote 。通常,提交后,我使用“git push
我用印地 TidHTTPServer和 TidServerIOHandlerSSLOpenSSL在我的服务器组件上处理命令和控制的 HTTPS 请求。 在某些情况下 - 服务器上没有任何记录的错误 -
更新:如果弄清楚了这一点,但我仍然对解释感兴趣。问题是我在运行下面的代码的同时也从 SqlWorkbenchJ 连接到我的 Redshift 集群(两者都在同一台笔记本电脑上运行)。第二次我断开 Sq
使用 CloudFormation 在 AWS 中创建带有附加 AutoScalingPolicy 的 AutoScalingGroup 时,您可能会收到错误 the load balancer do
我是一名优秀的程序员,十分优秀!