文章来源:微信公众号:猿天地  

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死锁排查的更多相关文章

  1. Java死锁排查和Java CPU 100% 排查的步骤整理

    ================================================= 人工智能教程.零基础!通俗易懂!风趣幽默!大家可以看看是否对自己有帮助! 点击查看高清无码教程 == ...

  2. JAVA死锁排查-性能测试问题排查思路

    死锁原因 Java发生死锁的根本原因是:在申请锁时发生了交叉闭环申请.即线程在获得了锁A并且没有释放的情况下去申请锁B,这时,另一个线程已经获得了锁B,在释放锁B之前又要先获得锁A,因此闭环发生,陷入 ...

  3. 一文学会Java死锁和CPU 100% 问题的排查技巧

    做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开 工欲善其事,必先利其器 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在 ...

  4. 【性能优化】一文学会Java死锁和CPU100%问题的排查技巧

    原文链接: 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在实际的工作或者面试就有遇到过: 第一个问题:Java死锁如何排查和解决? 第二个问题:服 ...

  5. java问题排查命令

    java问题排查命令 jps:查看java进程 jmap:导出堆详细信息(与jhat一起使用) jhat:分析Java堆的命令(与jmap一起使用) jstack:可以定位到线程堆栈,根据堆栈信息我们 ...

  6. 记录一次Mysql死锁排查过程

    背景 以前接触到的数据库死锁,都是批量更新时加锁顺序不一致而导致的死锁,但是上周却遇到了一个很难理解的死锁.借着这个机会又重新学习了一下mysql的死锁知识以及常见的死锁场景.在多方调研以及和同事们的 ...

  7. java 死锁演示

    java 死锁演示 java死锁 模拟死锁生成 死锁是由多个线程竞争同一个资源导致 package com.feshfans; /** * 1. 本代码为展示 java 中死锁的产生 * 2. 死锁的 ...

  8. java问题排查总结

    前些天发现:http://hellojava.info/这个站点,关于java问题排查分析总结线上故障总结其实是最有价值的,好的总结就是一个系统演进历史,是团队难得的积累沉淀. 花了不少时间看了下,顺 ...

  9. SQL Server死锁排查

    1. 死锁原理 根据操作系统中的定义:死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态. 死锁的四个必要条件:互斥条件(Mutua ...

随机推荐

  1. django中的懒加载机制

    懒加载在前端中的意义: 懒加载的主要目的就是作为服务器前端的优化,减少请求次数或者延迟请求数. 实现原理: 先加载一部分数据,当触发某个条件时利用异步加载剩余的数据,新得到的数据不会影响原有数据的显示 ...

  2. day10 字符编码

    字符编码 在python中出现乱码就是字符编码没有匹配的问题 python3中执行python3编辑的代码只要没有修改过编码,都是用utf-8,如果出现乱码就修改头文件,改成和原来编码相同的字符编码 ...

  3. python使用数组实现链表的策略分析

    python实现链表数据结构:数组/节点与引用 使用数组策略: 使用数组存储指向其他对象的引用 数组存储空间过度分配 数组填满后,分配一个更大的数组,将旧数组的内容复制到新数组中 class Arra ...

  4. Python-break/continue

    break:用于终止整个循环 continue:用于终止本次循环,而不终止整个循环的执行

  5. 数据可视化基础专题(九):Matplotlib 基础(一)坐标相关

    1.前言 图表要素如下图所示 # sphinx_gallery_thumbnail_number = 3 import matplotlib.pyplot as plt import numpy as ...

  6. db2数据库基本添加删除表字段总结

    1.添加字段 alter table [table_name] add [column_name] [column_type] 2.更改字段类型 alter table  [table_name] a ...

  7. CF940E Cashback 线段树优化DP

    题目描述 Since you are the best Wraith King, Nizhniy Magazin «Mir» at the centre of Vinnytsia is offerin ...

  8. vue-过渡动画和 第三方动画库导入,带图

    vue路由过渡动画 //用transition将路由出口包裹起来 <transition name="fade" mode="out-in"> &l ...

  9. django-rest-framework-源码解析001-整体框架

    简介 Django Rest Framework是一个强大且灵活的工具包,主要用以构建RESTful风格的Web API. Django REST Framework(简称DRF)可以在Django的 ...

  10. etcd3.0集群安装

    etcd 是一个分布式一致性键值存储,用于共享配置和服务发现,Go编写,并使用 Raft 一致性算法来管理高可用复制日志. 特性 简单:支持curl方式的用户API(http+json)安全:可选ss ...