Bee*_*ope 5 java debugging concurrency stack-trace jvm-hotspot
如果你得到一个过程,如堆栈转储,通过jstack,你会得到关于锁定的监视器(和同步),一个地址为每个信息.例如,从一个简单的死锁双线程进程(使用jstack):
"Thread-0" prio=10 tid=0x00007f1444042000 nid=0x2818 waiting for monitor entry [0x00007f14433ca000]
java.lang.Thread.State: BLOCKED (on object monitor)
at scrap.DeadlockTest$Deadlocker.run(DeadlockTest.java:49)
- waiting to lock <0x00000007c14e6378> (a java.lang.Object)
- locked <0x00000007c14e6368> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:619)
... (omitted some lines here)
Java stack information for the threads listed above:
===================================================
"Thread-1":
at scrap.DeadlockTest$Deadlocker.run(DeadlockTest.java:49)
- waiting to lock <0x00000007c14e6368> (a java.lang.Object)
- locked <0x00000007c14e6378> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:619)
"Thread-0":
at scrap.DeadlockTest$Deadlocker.run(DeadlockTest.java:49)
- waiting to lock <0x00000007c14e6378> (a java.lang.Object)
- locked <0x00000007c14e6368> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:619)
Run Code Online (Sandbox Code Playgroud)
有没有什么办法让,在Java代码运行时,上面显示的地址相同,如0x00000007c14e6368
?
我已经用显示器对应的对象标识哈希码尝试,以及MonitorInfo
通过ThreadMXBean
,没有运气(该值不对应,至少在64位Java).
Zag*_*rev -2
所以,你的问题实际上是,是否有某种方法可以确定程序中哪两个对象陷入了死锁?这个简单的例子实际上指出了一种检查死锁的方法。死锁最常见的原因之一是检索多个锁,但顺序不同。因此,请搜索锁定的代码,以确保您始终以相同的顺序请求锁定。
顺便说一句,您需要多个锁来执行某些操作,这意味着您应该更改设计,使任何操作只需要一个锁。
归档时间: |
|
查看次数: |
451 次 |
最近记录: |