Found one Java-level deadlock: ============================= "withdraw": waiting to lock monitor 0x00007f3400003620 (object 0x00000000d7fae540, a java.lang.Object), which is held by "deposit" "deposit": waiting to lock monitor 0x00007f3400004b20 (object 0x00000000d7fae530, a java.lang.Object), which is held by "withdraw" Java stack information for the threads listed above: =================================================== "withdraw": at com.von.thread.research.DeadThread.depositMoney(DeadThread.java:13) - waiting to lock <0x00000000d7fae540> (a java.lang.Object) - locked <0x00000000d7fae530> (a java.lang.Object) at com.von.thread.research.DeadThread.run(DeadThread.java:28) at java.lang.Thread.run(Thread.java:724) "deposit": at com.von.thread.research.DeadThread.withdrawMoney(DeadThread.java:21) - waiting to lock <0x00000000d7fae530> (a java.lang.Object) - locked <0x00000000d7fae540> (a java.lang.Object) at com.von.thread.research.DeadThread.run(DeadThread.java:29) at java.lang.Thread.run(Thread.java:724) Found 1 deadlock.
这里是一个非顺序加锁诱发的一个死锁场景。
好了,差不多了。 总结一下,在调优过程中,重点关注以下三类情况:
1. waiting for monitor entry thread state blocked。可能发生的问题: deadlock(sequential deadlock,starvation deadlock...)
2. waiting on condition sleeping or timed_waiting。可能发生的问题: IO bottleneck
3. Object.wait TIMED_WAITING。问题:wait & notifyAll使用上需要明确其性能及其局限性问题。External锁,更多的考虑使用await和singal方法。
参考文献:
http://architects.dzone.com/articles/how-analyze-java-thread-dumps
http://stackoverflow.com/questions/7698861/simple-java-example-runs-with-14-threads-why
http://www.longene.org/forum/viewtopic.php f=5&t=94&p=399#p399
http://www.slideshare.net/Byungwook/analysis-bottleneck-in-j2ee-application
http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html
JavaConcurrency in practice