Java虚拟机性能管理神器 - VisualVM(9) 排查JAVA应用程序线程死锁【转】

2015-03-11 19:59 1948人阅读 评论(0) 收藏 举报
Java虚拟机性能管理神器 - VisualVM(9) 排查JAVA应用程序线程死锁【转】 分类:
VisualVM(8) Java虚拟机性能管理神器 - VisualVM(9) 排查JAVA应用程序线程死锁【转】

版权声明:本文为博主原创文章,未经博主允许不得转载。

 

目录(?)[+]

 

Java虚拟机性能管理神器 - VisualVM(9) 排查JAVA应用程序线程锁

1. JAVA应用程序线程锁原因

JAVA线程锁的例子和原因网上一大堆,我也不在这里深入说明,这里主要是否讲如何使用VisualVM进行排查。至于例子可以看这里:http://blog.csdn.net/fengzhe0411/article/details/6953370

这个例子比较极端,一般情况下,出现锁竞争激烈是比较常见的。

2. 排查JAVA应用程序线程锁

启动 VisualVM,在应用程序窗口,选择对应的JAVA应用,在详情窗口》线程标签(勾选线程可视化),查看线程生命周期状态,主要留意线程生命周期中红色部分。

Java虚拟机性能管理神器 - VisualVM(9) 排查JAVA应用程序线程死锁【转】

(1)绿色:代表运行状态。一般属于正常情况。如果是多线程环境,生产者消费者模式下,消费者一直处于运行状态,说明消费者处理性能低,跟不上生产者的节奏,需要优化对应的代码,如果不处理,就可能导致消费者队列阻塞的现象。对应线程的【RUNNABLE】状态。

(2)蓝色:代表线程休眠。线程中调用Thread.sleep()函数的线程状态时,就是蓝色。对应线程的【TIMED_WAITING】状态。

(3)黄色:代表线程等待。调用线程的wait()函数就会出现黄色状态。对应线程的【WAITING】状态。

(4)红色:代码线程锁定。对应线程的【BLOCKED】状态。

Java虚拟机性能管理神器 - VisualVM(9) 排查JAVA应用程序线程死锁【转】

3. 分析解决JAVA应用程序线程锁

发生线程锁的原因有很多,我所遇到比较多的情况是多线程同时访问同一资源,且此资源使用synchronized关键字,导致一个线程要等另外一个线程使用完资源后才能运行。例如再没有连接池的情况下,同时访问数据库接口。这种情况会导致性能的极具下降,解决的方案是增加连接池,或者修改访问方式。或者将资源粒度细化,类似ConCurrentHashMap中的处理方式,将资源分为多个更小粒度的资源,在更小粒度资源上来处理锁,就可以解决资源竞争激烈的问题。]

上一篇:win7安装时,避免产生100m系统保留分区的办法


下一篇:ASP.NET MVC分页实现之改进版-增加同一个视图可设置多个分页