[转]Java死锁排查
文章来源:微信公众号:猿天地
1. 死锁的概念:
是Java多线程情况下,两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞现象,若无外力作用,它们都讲无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在相互等待的进程成为死锁进程。
2. 出现死锁的条件:
(1)必须是两个或者两个以上进程(线程)
(2)必须有竞争资源
3. 如果排查代码中出现了死锁?
死锁代码:
public class JStackDemo { public static void main(String[] args) {
Thread t1 = new Thread(new DeadLockTest(true));
Thread t2 = new Thread(new DeadLockTest(false));
t1.setName("thread-test-1");
t2.setName("thread-test-2");
t1.start();
t2.start();
} } class DeadLockTest implements Runnable { public boolean flag; //控制线程 DeadLockTest(boolean flag) {
this.flag = flag;
} @Override
public void run() {
// 如果flag的值为true则调用t1线程
if(flag){
while (true){
synchronized (Demo.o1) {
System.out.println("o1" + Thread.currentThread().getName());
synchronized (Demo.o2) {
System.out.println("o2" + Thread.currentThread().getName());
}
}
}
} else {
// 如果flag的值为false则调用t2线程
while (true) {
synchronized (Demo.o2) {
System.out.println("o2" + Thread.currentThread().getName());
synchronized (Demo.o1) {
System.out.println("o2" + Thread.currentThread().getName());
}
}
}
}
}
} class Demo {
static Object o1 = new Object();
static Object o2 = new Object();
}
方法一:使用jps + jstack
1. 在windows命令窗口,使用 jps -l 查看当前的java进程的pid,通过包路径很容易区分出自己开发的程序进程。
2. 使用 jstack -l 908 如果出现一下错误信息,说明是死锁线程
方法二:使用jconsole
在window打开JConsole,JConsole是一个图形化的监控工具。(本人没有试过)
1. 在windows命令窗口,输出JConsole
2. 选择到线程的tab页上, 查看线程状态
方法三:使用Java Visual VM
在window打开 jvisualvm,jvisualvm是一个图形化的监控工具!
下载地址:https://visualvm.github.io
1. 在windows命令窗口,输出 jvisualvm ,会弹出Java VisualVM窗口
2. 点击程序要查看的程序线程,选择 “线程” tab页,发现 “监视” 的红颜色线程,就是死锁的。点击右侧 “线程Dump” 可以查看具体错误信息。
[转]Java死锁排查的更多相关文章
- Java死锁排查和Java CPU 100% 排查的步骤整理
================================================= 人工智能教程.零基础!通俗易懂!风趣幽默!大家可以看看是否对自己有帮助! 点击查看高清无码教程 == ...
- JAVA死锁排查-性能测试问题排查思路
死锁原因 Java发生死锁的根本原因是:在申请锁时发生了交叉闭环申请.即线程在获得了锁A并且没有释放的情况下去申请锁B,这时,另一个线程已经获得了锁B,在释放锁B之前又要先获得锁A,因此闭环发生,陷入 ...
- 一文学会Java死锁和CPU 100% 问题的排查技巧
做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开 工欲善其事,必先利其器 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在 ...
- 【性能优化】一文学会Java死锁和CPU100%问题的排查技巧
原文链接: 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在实际的工作或者面试就有遇到过: 第一个问题:Java死锁如何排查和解决? 第二个问题:服 ...
- java问题排查命令
java问题排查命令 jps:查看java进程 jmap:导出堆详细信息(与jhat一起使用) jhat:分析Java堆的命令(与jmap一起使用) jstack:可以定位到线程堆栈,根据堆栈信息我们 ...
- 记录一次Mysql死锁排查过程
背景 以前接触到的数据库死锁,都是批量更新时加锁顺序不一致而导致的死锁,但是上周却遇到了一个很难理解的死锁.借着这个机会又重新学习了一下mysql的死锁知识以及常见的死锁场景.在多方调研以及和同事们的 ...
- java 死锁演示
java 死锁演示 java死锁 模拟死锁生成 死锁是由多个线程竞争同一个资源导致 package com.feshfans; /** * 1. 本代码为展示 java 中死锁的产生 * 2. 死锁的 ...
- java问题排查总结
前些天发现:http://hellojava.info/这个站点,关于java问题排查分析总结线上故障总结其实是最有价值的,好的总结就是一个系统演进历史,是团队难得的积累沉淀. 花了不少时间看了下,顺 ...
- SQL Server死锁排查
1. 死锁原理 根据操作系统中的定义:死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态. 死锁的四个必要条件:互斥条件(Mutua ...
随机推荐
- like's photos
wallhaven官网
- @Autowired 引发的一系列思考
关于Java注解 注解定义 标记注解 - 没有元素 @interface Marker { } 单元素注解 - 只有一个元素 @interface Single { String value() de ...
- redis(二十三):Redis 集群(proxy 型)二
redis的确是一个非常高效的缓存服务器,但是单台redis服务器的内存管理能力有限,如果一味的加大内存的话会导致redis服务器的性能下降,所以就必须要搭建redis集群来提供服务.在redis官方 ...
- Visual SVN Server+TortoiseSVN进行源代码管理
安装VisualSVN Server 安装完之后,可配置SVN Server的IP地址,右键下图红色部分,选择属性,然后可配置ServeName和IP Address 之后可以创建用户.用户组和项目库 ...
- .net core微服务——gRPC(下)
序 上一篇博客把grpc的概念说了个大概,介绍了proto的数据类型,基本语法,也写了个小demo,是不是没那么难? 今天要从理论到实际,写两个微服务,并利用grpc完成两者之间的通信.只是作为dem ...
- day9 python之文件操作
1.文件操作 1.1 基本模式 # 格式 f = open("相对路径/绝对路径",mode = "模式",encoding = "编码级" ...
- maven&nexus_repository 私库搭建与使用
一.nexus仓库安装 1,http://www.sonatype.org/nexus/ 下载sso版本,免费2,tar -zxvf nexus-2.11.1-01-bundle.tar.gz3 ...
- 牛客练习赛66A题解
思路 令 \(sq=\sqrt x\) ,则答案必然在 $ sq^2$ 和 $ (sq+1)^2 $ 之间,两者比较一下谁离 \(x\) 最近,就是答案了. 代码 #include <bits/ ...
- 搭建高可用kubernetes集群(keepalived+haproxy)
序 由于单master节点的kubernetes集群,存在master节点异常之后无法继续使用的缺陷.本文参考网管流程搭建一套多master节点负载均衡的kubernetes集群.官网给出了两种拓扑结 ...
- Spark入门(第1讲)
一.Spark是什么 引用官方文档的一句话 Apache Spark is a unified analytics engine for large-scale data processing. Ap ...