摘要:并且分别给出了,线程的堆栈,就可以很快定位代码。避免无限期等待当一个线程必须等待另外一个线程的时候,最好加上一个等待时间。
运行了一段时间的程序,可能因为不小心的一些修改,造成死锁,本人就VisualVM简单的介绍下死锁的检测。
死锁程序package jvisualVM; public class DeadLock { public static void main(String[] args) { Resource r1 = new Resource(); Resource r0 = new Resource(); Thread myTh1 = new LockThread1(r1, r0); Thread myTh0 = new LockThread0(r1, r0); myTh1.setName("DeadLock-1 "); myTh0.setName("DeadLock-0 "); myTh1.start(); myTh0.start(); } } class Resource { private int i; public int getI() { return i; } public void setI(int i) { this.i = i; } } class LockThread1 extends Thread { private Resource r1, r2; public LockThread1(Resource r1, Resource r2) { this.r1 = r1; this.r2 = r2; } @Override public void run() { int j = 0; while (true) { synchronized (r1) { System.out.println("The first thread got r1"s lock " + j); synchronized (r2) { System.out.println("The first thread got r2"s lock " + j); } } j++; } } } class LockThread0 extends Thread { private Resource r1, r2; public LockThread0(Resource r1, Resource r2) { this.r1 = r1; this.r2 = r2; } @Override public void run() { int j = 0; while (true) { synchronized (r2) { System.out.println("The second thread got r2"s lock " + j); synchronized (r1) { System.out.println("The second thread got r1"s lock" + j); } } j++; } } }分析
本地的话vvm会立刻提醒有死锁程序,远程的话,生成线程Dump文件即可,发现是线程DeadLock-0,DeadLock-1处于监控状态,很有可能是造成死锁的线程,点击线程Dump。
打开Dump文件,发现如下:
这是一个java级别的死锁(java代码造成的),DeadLock-0 线程想给公共资源(0x00000007d7a080d8, a com.mousycoder.server.thead.Resource)加锁,但是这个资源还是被DeadLock-1线程占有。DeadLock-1线程想去给公共资源(object 0x00000007d7a080e8, a com.mousycoder.server.thead.Resource)加锁,但是这个资源被DeadLock占有。
并且分别给出了,线程的堆栈,就可以很快定位代码。
避免死锁策略死锁是并发程序设计中十分常见的逻辑错误。
避免嵌套锁
本例子就是嵌套锁,当你已经给一个资源上锁后,避免再去锁住另一个。
只对需要的地方加锁
比如只是要对特定的字段加锁,就不要锁住整个obejct。
避免无限期等待
当一个线程必须等待另外一个线程的时候,最好加上一个等待时间。超过时间,自动放弃本操作,避免进程悬挂。
把大事务拆成小事务
早提交,早回滚。
整个VisaulVm教程就结束了
感谢您的耐心阅读,如果您发现文章中有一些没表述清楚的,或者是不对的地方,请给我留言,你的鼓励是作者写作最大的动力,
如果您认为本文质量不错,读后觉得收获很大,不妨小额赞助我一下,让我更有动力继续写出高质量的文章。
支付宝
微信
作 者 : @mousycoder
原文出处 : http://mousycoder.com/2016/02...
创作时间:2016-2-15
更新时间:2016-2-15
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/65474.html
摘要:几个死锁场景两个线程相互调用导致互相等待同步结束。线程为了检测死锁,它需要递进地检测所有被请求的锁。思考题线程有哪些状态这些线程大多处于什么样的状态分布我们可以称系统运行是健康的。 前言 在上一期Tomcat优化中,针对JVM相关主要参数做过一定说明,这一期主要介绍进行一些概念及经验。后面分章节去讲述相关工具的基本使用。 优化优先级 整体来讲,系统优化应先优化架构及代码,来解决具体功能...
摘要:快照,带线程命令,是显示全部进程,是显示线程,全格式输出显示进程树,不加显示所有实时快照推荐程度按数字从小到大。 有时候好好的程序放到生产服务器上一段时间后,就会发现服务器响应缓慢,进而进一步发现是cpu过高,于是就慌了,造成cpu过高的原因很多,不过大多是由于资源吃紧造成,例如:sql执行过慢,程序里存在死循环,数据库连接未释放,网络阻塞导致的第三方框架代码出现死循环,大量的操作导致...
摘要:并发和并行并发和并行是两个非常容易被混淆的概念。并发说的是在一个时间段内,多件事情在这个时间段内交替执行。并行说的是多件事情在同一个时刻同事发生。由于线程池是一个线程,得不到执行,而被饿死,最终导致了程序死锁的现象。 同步(Synchronous)和异步(Asynchronous) 同步和异步通常来形容一次方法调用,同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为...
摘要:点击进入我的博客命令行工具这些工具大多数是类库的一层薄的包装,它们的主要功能代码是在类库中实现的。可视化工具是到目前为止随发布的功能最强大的运行监视和故障处理程序,并且可以预见在未来一段时间内都是官方主力发展的虚拟机故障处理工具。 点击进入我的博客 3.1 JDK命令行工具 showImg(https://segmentfault.com/img/remote/14600000174...
阅读 2215·2021-11-23 09:51
阅读 967·2021-11-18 10:02
阅读 3399·2021-10-13 09:49
阅读 1233·2021-09-22 14:57
阅读 9907·2021-08-18 10:20
阅读 1133·2019-08-30 15:55
阅读 2167·2019-08-29 16:06
阅读 3196·2019-08-29 11:14