如何在学习Java过程中死锁跟踪分析的处理!
2017-10-15 09:54
501 查看
如何在学习Java过程中死锁跟踪分析的处理!
死锁
死锁: 多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。JAVA 中死锁产生的四个必要条件
互斥使用,当资源被一个线程使用(占有)时,别的线程不能使用
不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。
请求和保持,当资源请求在请求其他的资源的同时保持对原有资源的占有。
循环等待,存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。
经典案例
先来看一段经典的死锁代码,两个方法中分别获取了class literals方式的锁分析: method1 和 method2 都会去获取Integer和String两把锁,但是获取锁的顺序不一致,在并行情况,当两个方法未及时释放自己的锁,又同时去获取另外一把锁这时候就会出现死锁情况
举个例子: 吃饭需要碗和筷子,小明吃饭的时候先拿筷子在拿碗,小红相反,再一次拿取餐具的时候,小明先拿到筷子,正准备拿碗的时候被小红抢先了一步拿碗,这时候都要吃饭但谁也不让谁,结果就是都饿死(死锁)
分析手段
命令: JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps、jstack、jmap、jhat、jstat等小巧的命令工具,本章主要使用到jps与jstack做分析jps: 过滤出Java本身的进程以及运行的引导类,就是引导main方法所在的类。
jstack: 主要用来查看某个Java进程内的线程堆栈信息
打开dos界面,输入jps
找到当前main的pid,使用jstack pid命令
我们可以发现method1锁住了<0x000000076ae03e68>等待<0x000000076ae008d8>,method2恰恰相反,这个时候死锁就发生了…
日志滑动到后面,可以发现有一个Found one Java-level deadlock,然后也告诉了我们代码在多少行,在知道问题代码所在地后,解决起来就简单了(改变锁的顺序,完美解决问题…)
补充两句
上面讲了什么是死锁以及定位问题方式,其实JDK中,已经内置了很多锁相关的类都在java.util.concurrent.locks包下,使用简单且可以有效的的避免死锁问题,或者使用java.util.concurrent.Semaphore(信号量)机制,篇幅过长会导致阅读兴趣下降,所以信号量处理锁的方式在GIT中,有兴趣可以从GIT地址获取。相关文章推荐
- vlc学习计划(6)--网络数据流接收处理过程分析
- BT源代码学习心得(七):跟踪服务器(Tracker)的代码分析(HTTP协议处理对象)
- Windows XP \Windows 2003启动过程的学习及故障分析处理(一)
- BT源代码学习心得(七):跟踪服务器(Tracker)的代码分析(HTTP协议处理对象) -- 转贴自 wolfenstein (NeverSayNever)
- Windows XP \Windows 2003启动过程的学习及故障分析处理(五)
- vlc学习计划(5)--网络数据流接收处理过程分析
- BT源代码学习心得(八):跟踪服务器(Tracker)的代码分析(用户请求的实际处理)
- Windows XP \Windows 2003启动过程的学习及故障分析处理(六D)
- Java学习疑点(5)--使用多线程的时候如何注意避免死锁发生?
- Windows XP \Windows 2003启动过程的学习及故障分析处理(三)
- java学习笔记_类建立对象初始化过程分析
- BT源代码学习心得(七):跟踪服务器(Tracker)的代码分析(HTTP协议处理对象)
- Windows XP \Windows 2003启动过程的学习及故障分析处理(七)
- Windows XP \Windows 2003启动过程的学习及故障分析处理(六A)
- 如何学习Java,java学习过程 --【转载】
- vlc学习计划(6)--网络数据流接收处理过程分析
- BT源代码学习心得(七):跟踪服务器(Tracker)的代码分析(HTTP协议处理对象) -- 转贴自 wolfenstein (NeverSayNever)
- Windows XP \Windows 2003启动过程的学习及故障分析处理(六B)
- BT源代码学习心得(八):跟踪服务器(Tracker)的代码分析(用户请求的实际处理) - 转贴自 wolfenstein (NeverSayNever)
- BT源代码学习心得(八):跟踪服务器(Tracker)的代码分析(用户请求的实际处理) - 转贴自 wolfenstein (NeverSayNever)