Java如何查看死锁
Java中当我们的开发涉及到多线程的时候,这个时候就很容易遇到死锁问题,刚开始遇到死锁问题的时候,我们很容易觉得莫名其妙,而且定位问题也很困难。
因为涉及到java多线程的时候,有的问题会特别复杂,而且就算我们知道问题出现是因为死锁了,我们也很难弄清楚为什么发生死锁,那么当我们遇到了死锁问题,我们应该如何来检测和查看死锁呢?
Java中jdk 给我们提供了很便利的工具,帮助我们定位和分析死锁问题:
1、死锁产生原因:当两个或者多个线程互相持有一定资源,并互相等待其他线程释放资源而形成的一种僵局,就是死锁。
2、构建一个死锁的场景:
public class Test {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
synchronized (B.class) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (A.class) {
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (A.class) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (B.class) {
}
}
}
}).start();
}
}
class A {
}
class B {
}
可以看到运行时,一个线程持有A资源,希望使用B资源,而另一个线程持有B资源,希望使用A 资源,然后就陷入了相互等待的僵局,这样就形成了死锁。
3、Jconsole查看死锁
进入java安装的位置,输入Jconsole,然后弹出界面(或者进入安装目录/java/jdk1.70_80/bin/,点击Jconsole.exe):
然后点击进入:
然后点击检测死锁:
然后可以看到造成死锁的两个线程,以及死锁原因:
Thread-0:持有java.lang.Class@1694ce18,需要java.lang.Class@1feb0edd,但是java.lang.Class@1feb0edd却被Thread-1持有,然后陷入等待。
Thread-1:持有java.lang.Class@1feb0edd,需要java.lang.Class@1694ce18,但是java.lang.Class@1694ce18却被Thread-0持有,然后陷入等待。
4、Jstack查看死锁:
同样,也是进入jdk安装目录的bin下面,输入jps,先查看我们要检测死锁的进程:
然后可以看到进程Test的进程号:8384,然后执行:Jstack -l 8384
查看死锁信息:
Java如何查看死锁的更多相关文章
- Java如何查看死锁?
转载自 https://blog.csdn.net/u014039577/article/details/52351626 Java中当我们的开发涉及到多线程的时候,这个时候就很容易遇到死锁问题,刚开 ...
- [java] jstack 查看死锁问题
package com.xwolf.java.thread.ch2; /** * Created by Administrator on 2016/1/4 0004. */ public class ...
- Java多线程:死锁
周末看到一个用jstack查看死锁的例子.昨天晚上总结了一下jstack(查看线程).jmap(查看内存)和jstat(性能分析)命令.供大家参考 1.Jstack 1.1 jstack能得到运行j ...
- Java精通并发-死锁检测与相关工具详解
关于死锁其实在之前https://www.cnblogs.com/webor2006/p/10659938.html的jvm学习中已经详细举过例子了,不过这里再来复习一下,另外是从并发这个专题领域的角 ...
- SQLServer查看死锁
SQLServer查看死锁 if exists ( select * from sys.procedures where name like '%USP_ShowLocks%' ) drop proc ...
- mysql查看死锁和解除锁
解除正在死锁的状态有两种方法: 第一种: 1.查询是否锁表 show OPEN TABLES where In_use > 0; 2.查询进程(如果您有SUPER权限,您可以看到所有线程.否则, ...
- java反射查看jar包中所有的类名方法名
不反编译,不用其他工具,用java反射查看jar包中所有的类名方法名,网上很多都报错,下面这个你试试看:话不多说直接撸代码: import java.lang.reflect.Field; impor ...
- SQL查看死锁+清理死锁
----查看sql死锁 CREATE procedure sp_who_lock as begin declare @spid int declare ...
- 使用 mysqladmin debug 查看死锁信息
使用 mysqladmin debug 查看死锁信息 mysqladmin -S /mysql/data/mysql.sock debug 然后在error日志中,会看到: 11 lock struc ...
随机推荐
- 3-1 实现简单的shell sed替换功能
1.需求 程序1: 实现简单的shell sed替换功能 file1 的内容copy到file2 输入参数./sed.py $1 $2 $1替换成$2 (把a替换成% ) 2.个人思路 open ...
- cogs1889 [SDOI2008]Cave 洞穴勘测 link-cut tree
link-cut tree // It is made by XZZ #include<cstdio> #include<algorithm> #define il inlin ...
- 并行Linq
有时候我们对大批量数据进行处理,此时并行linq就起作用了. 并行查询 对于以下查询可以耗时会非常大,如下: ; var r = new Random(); , arraySize).Select(x ...
- 关于AutoMapper和WCF的一些认识
现在互联网时代呈尚快速开发,快速迭代.伴随着必然产生一些好用的第三方工具,今天有幸看到了Automapper这种类似ORM的框架,但是跟ORM还不太一样, ORM是实体和数据库表之间的映射,而此框架主 ...
- Asp.Net Form验证不通过,重复登录(.net4,4.5form验证兼容性问题)
问题产生根源: 当然,其实应该需要保持线上所有机器环境一致!可是,写了一个小程序.使用的是4.5,aysnc/await实在太好用了,真心不想把代码修改回去. so,动了念头,在这台服务器上装个4.5 ...
- linux下查看端口是否被占用以及查看所有端口
1.查看服务器端口是否被占用 >lsof -i:8081 2.查看服务器所有端口 >netstat -ntlp 3.查看服务器是否开放某端口 tcp端口:>netstat -ntp ...
- SpringMVC 完美解决PUT请求参数绑定问题(普通表单和文件表单)
一 解决方案 修改web.xml配置文件 将下面配置拷贝进去(在原有的web-app节点里面配置 其它配置不变) <!-- 处理PUT提交参数(只对基础表单生效) --> <filt ...
- 腾讯hr面
腾讯hr面面经 20181018 寒暄几句 hr自我介绍 hr介绍面试和最后出结果的时间周期 进入主题 自我介绍 考研成绩专业第一 聊考研(考研的经过.考研和保研) 本科成绩 考研成绩超长发挥还是正常 ...
- 百道Python入门级练习题(新手友好)第一回合——矩阵乘法
题目描述 [问题描述] 编写程序,完成3*4矩阵和4*3整数矩阵的乘法,输出结果矩阵. [输入形式] 一行,供24个整数.以先行后列顺序输入第一个矩阵,而后输入第二个矩阵. [输出形式] 先行后列顺序 ...
- zabbix切换中文,监控图下方显示乱码,监控图X轴不显示时间问题解决(适用于所有版本)
一.现象: abbix3.4安装好后添加zabbix图形,发现有好多方块 这是因为zabbix web程序缺少中文字体 二.解决方案1: 1.在windows系统找一个中文字体上传到服务器中,我这里找 ...