死锁如何定位,修复?及其预防?
title : 每日深耕,勤练不缀之死锁定位,修复,预防
模拟定位问题,就选取常见的jstack,可以使用jps或者系统的ps命令、任务管理器等工具,确定进程ID
其次,调用jstack获取线程栈:
${JAVA_HOME}\bin\jstack your_pid
仔细看,有一个线程掌握的一个锁恰好是下一个线程需要的锁
具体步骤是:
区分线程状态—>查看等待目标—>对比monitor等持有状态
所以,理解线程基本状态和并发相关元素是定位问题的关键,然后调用栈结构,可以找到问题
如果我们开发自己的管理工具,遇到死锁,可以用更加程序化的方式扫描服务进程、定位死锁,可以考虑使用javaAPI:ThreadMXBean,直接提供了findDeadlockedThreads()方法用于定位
import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;public class FindDeadLocked {public static void main(String[] args) throws InterruptedException {ThreadMXBean mbean = ManagementFactory.getThreadMXBean();//容器Runnable dlCheck = new Runnable() {@Overridepublic void run() {long[] threadIds = mbean.findDeadlockedThreads();if (threadIds != null) {//检查所有线程ThreadInfo[] threadInfos = mbean.getThreadInfo(threadIds);System.out.println("Detected deadlock threads");for(ThreadInfo threadInfo:threadInfos){System.out.println(threadInfo.getThreadName());}}}};//并发包中的方法ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);//稍等5秒,然后每10秒进行一次死锁扫描scheduler.scheduleAtFixedRate(dlCheck,5L,10L, TimeUnit.SECONDS);}
}
预防死锁
发生死锁的原因主要有三点:
1.互斥条件,类似于java中的Monitor都是独占的,要不是我用,要不是你用
2.互斥条件长期持有,在使用结束之前,自己不会释放,也不能被其他线程抢占
3.循环依赖关系,两个或者多个个体之间出现了锁的链条环 第一种方法:尽量避免使用多个锁,嵌套的synchronized或者lock非常容易出问题
设计时,既要支持阻塞模式,又要支持非阻塞模式就很容易出问题
//Thread HttpClient-6-SelectorManager
readlock.lock();
writelock.lock();
//持有readlock/writelock,调用close()需要获得closelock
close();
//Thread HttpClient-6-Worker-2持有closelock
implCloseSelectableChannel();//向获得readlock
进入死锁!!
所以不能赋予代码太多的职责
第二种方法:
尽量设计好锁的顺序
反例:
时序问题下,可能造成死锁
第三个方法:
使用带超时的方法,为程序带来更多可控性
Object.wait(…)
第四个方法:
FindBugs来尝试使用固定的模式寻找死锁定位,但是现在仍有多欠缺。所以Java官方文档提供了相应JVM参数和基本原则。
死锁如何定位,修复?及其预防?相关推荐
- 2.42死锁的处理策略一预防死锁
2.42死锁的处理策略一预防死锁
- 死锁(死锁的发生条件、预防死锁、避免死锁)
死锁 什么是死锁 各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象. 进程死锁.饥饿.死循环的区别 饥饿:由于长期得不到想要的资源,某进程无法向前推进的现象.比如:在短进程优先(SP ...
- 死锁发生的条件和预防
所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程. ...
- 一次java线程死锁的定位
ETL流程卡死原因定位 一.现象:模板大量并发执行流程,经常流程节点脚本运行完成之后,卡死,不更新状态,不继续往下执行.查看日志未发现任何异常信息. 二.定位. jps -ml查看进程号pid,然后j ...
- c++产生死锁的必要条件?已经如何预防死锁?
产生死锁的必要条件?已经如何预防死锁? 一.计算机系统中的死锁 二.产生死锁的必要条件 三.处理死锁的方法 四.预防死锁 五.解决死锁 一.计算机系统中的死锁 竞争不可抢占性资源引起死锁 竞争可消耗资 ...
- 线上频繁发生Full GC 如何调优?如何快速定位OOM、cpu飙升、线程死锁等问题
文章目录 1. jvm调优命令.工具介绍 ①:jps ②:jmap 查看应用中各实例生成情况 快速定位内存突然飙升导致的OOM异常 查看堆内存使用情况 ③:Jstack 检测线程死锁 快速定位导致cp ...
- 面试中死锁的考点总结(死锁的定义、产生原因、四个必要条件、如何预防)
死锁 死锁定义:死锁指多个进程因竞争资源而造成的一种互相等待的僵局,若无外力作用,这些进程都无法向前推进,就造成了死锁. 产生原因:1.竞争资源 2.进程请求和释放资源的顺序不当,导致死锁 死锁产生的 ...
- javacore分析工具_线上死锁定位分析
" 记录一次线上死锁的定位分析." 昨晚睡觉前提了点代码到 jfoa(https://github.com/JavaFamilyClub/jfoa) 怎么也没想到导致 ...
- 预防死锁的方法以及死锁的检测与解除
3.6 预防死锁的方法 一.预防死锁 二.系统安全状态 三.利用银行家算法避免死锁 预防死锁和避免死锁这两种方法,实质上都是通过施加某些限制条件,来预防发生死锁: 两者的区别主要在于: 预防死锁: 施 ...
最新文章
- STL - 容器 - Set
- mysql使用数据库_MySQL数据库的常用操作
- 怎么new一个指针_19. Go语言里的 make 和 new 有什么区别?
- 第10步 (1)logback.xml日志配置(2) ftp(上传文件)服务器配置(3) idea注入和自动编译配置(4)项目提交gitee(5)fe助手和restlet client
- 编译我的hello.ko
- win10配置mysql8.0_Win10下mysql 8.0.20 安装配置方法图文教程
- 网络规划设计师考试总结
- 回溯法 批处理作业调度_不懂调度系统架构,就不要谈银行数据仓库
- pillow 图像 基本概念
- PyTorch命令行中执行python程序使用指定的GPU
- 聊聊手游的那些惊喜与惊吓
- git配置ssh秘钥(公钥以及私钥)windows
- 构建Flex应用的10大误区
- Sqlite Developer 3.8 破解
- 在美团,我从暑期实习到转正
- 路由器硬件升级和软件改造
- 屏幕快照之旅:Android 4.2 Jelly Bean的10个新功能
- oracle优化器analyzed,Oracle 学习之 性能优化(十三) 索引
- MAC安装Securecrt破解
- 使用Java合并excel的sheet的操作
热门文章
- 面试后别忘了说“谢谢”
- Linux系统用户管理和su、sudo详细讲解
- python 公园、绿地、饭店等任何一种poi类型信息数据的爬取
- [转载]什么叫资源整合? 看懂了多赚一个亿!
- pthread_create failed: Resource temporarily unavailable
- Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 2.2 Spring Cloud Eureka 进阶
- Hadoop HA 搭建(三台主机)
- 带有单位的Excel表格如何计算乘积
- 形容计算机老师风采的句子,形容老师讲课好的句子,赞美讲课讲得好的句子,形容讲课讲得好的句子...
- 黑苹果 未能与恢复服务器取得联系,Hackintosh百分百解决iMessage与Facetime不能登录问题...