Java 这个堆栈转储是否表示我有死锁?
我有一个REST服务 当我对restapi执行“curl”时,命令挂起 我运行了jstack&这是两个处于阻塞状态的线程的总结输出Java 这个堆栈转储是否表示我有死锁?,java,concurrency,deadlock,Java,Concurrency,Deadlock,我有一个REST服务 当我对restapi执行“curl”时,命令挂起 我运行了jstack&这是两个处于阻塞状态的线程的总结输出 "pool-2-thread-11" prio=6 tid=0x01d51800 nid=0x2394 waiting for monitor entry [0x05e6f000..0x05e6fce8] java.lang.Thread.State: BLOCKED (on object monitor) at com.moi.DefaultImage
"pool-2-thread-11" prio=6 tid=0x01d51800 nid=0x2394
waiting for monitor entry [0x05e6f000..0x05e6fce8]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.moi.DefaultImageProcessor$DownloadAndScaleCallable.call(
DefaultImageProcessor.java:168)
- waiting to lock <0x257aa440>
(com.moi.ImageUriMutexImpl$MutexImpl)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(
ThreadPoolExecutor.java:885)
"pool-2-thread-10" prio=6 tid=0x01d51000 nid=0x18d0
waiting for monitor entry [0x05e1f000..0x05e1fd68]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.moi.DefaultImageProcessor$DownloadAndScaleCallable.call(
DefaultImageProcessor.java:168)
- waiting to lock <0x257aa6b8>
(com.moi.ImageUriMutexImpl$MutexImpl)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(
ThreadPoolExecutor.java:885)
“pool-2-thread-11”优先级=6 tid=0x01d51800 nid=0x2394
正在等待监视器条目[0x05e6f000..0x05e6fce8]
java.lang.Thread.State:阻塞(在对象监视器上)
在com.moi.DefaultImageProcessor$downloads和scaleCallable.call上(
DefaultImageProcessor.java:168)
-等待锁定
(com.moi.ImageUriMutexImpl$MutexImpl)
位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
位于java.util.concurrent.FutureTask.run(FutureTask.java:138)
位于java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
位于java.util.concurrent.FutureTask.run(FutureTask.java:138)
位于java.util.concurrent.ThreadPoolExecutor$Worker.runTask(
ThreadPoolExecutor.java:885)
“池2线程10”优先级=6 tid=0x01d51000 nid=0x18d0
正在等待监视器条目[0x05e1f000..0x05e1fd68]
java.lang.Thread.State:阻塞(在对象监视器上)
在com.moi.DefaultImageProcessor$downloads和scaleCallable.call上(
DefaultImageProcessor.java:168)
-等待锁定
(com.moi.ImageUriMutexImpl$MutexImpl)
位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
位于java.util.concurrent.FutureTask.run(FutureTask.java:138)
位于java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
位于java.util.concurrent.FutureTask.run(FutureTask.java:138)
位于java.util.concurrent.ThreadPoolExecutor$Worker.runTask(
ThreadPoolExecutor.java:885)
我想知道如何读取这个堆栈转储。在僵局中我应该寻找什么迹象
更新我解决了我的问题!基本上,我是在同步块中执行HttpClient 4.0访问。HttpClient表现不好&没有返回&它保留了锁。通过jstack,有两个线程持有锁,这导致了上述问题。我现在明白了,这并不是死锁,而是我的同步块花了太长时间才返回。如果您注意到命令“挂起”,并且您已经识别出一个互斥锁上阻塞的两个线程。。。我得说你很清楚这些标志
这取决于你的服务是什么。查找性能问题和数据一致性问题。例如,由于请求量的增加而陷入困境而没有响应,甚至严重影响性能,这些都是您可能遇到问题的好迹象。此外,多个请求之间不一致的数据(同样,取决于您的服务)也可能会导致问题。如果您注意到命令“挂起”,并且您已确定在互斥锁上阻塞了两个线程。。。我得说你很清楚这些标志
这取决于你的服务是什么。查找性能问题和数据一致性问题。例如,由于请求量的增加而陷入困境而没有响应,甚至严重影响性能,这些都是您可能遇到问题的好迹象。此外,多个请求之间不一致的数据(同样,取决于您的服务)也可能表明存在问题。从小堆栈跟踪中,线程只等待获取锁。在跟踪中查找对象0x257aa440和0x257aa6b8,并查看是谁锁定了这些对象。检查该线程是否被阻塞
在死锁情况下,您将看到一个完整的阻塞状态循环。还要多次进行跟踪,以确认阻塞状态是瞬时还是长时间等待。从小堆栈跟踪中,线程仅等待获取锁。在跟踪中查找对象0x257aa440和0x257aa6b8,并查看是谁锁定了这些对象。检查该线程是否被阻塞
在死锁情况下,您将看到一个完整的阻塞状态循环。还要多次进行跟踪,以确认阻塞状态是暂时的还是长时间的等待。这是两个线程在争夺同一资源,因此不,这在iself中不是问题。不过,这可能是问题的一半 如果这两个线程是唯一被阻塞的线程,那么您就不会处于死锁状态。死锁(最简单的形式)是两个线程在两个不同的对象上都有一个锁,但它们都希望在另一个对象上有一个锁 也就是说,从你提供的情况来看,不,你没有陷入僵局。但如果事情悬而未决,并开始备份,那么这是一个很好的可能性,但不可能(或至少很难)从堆栈转储中确定
编辑:等等,它们没有锁定在同一个对象上。但是两个线程都在同一个函数中。我发现这不太可能(单独)导致死锁,但它可能是线程循环的一部分,导致死锁。这是两个线程争用同一资源,因此,不,这本身不是问题。不过,这可能是问题的一半 如果这两个线程是唯一被阻塞的线程,那么您就不会处于死锁状态。死锁(最简单的形式)是两个线程在两个不同的对象上都有一个锁,但它们都希望在另一个对象上有一个锁 也就是说,从你提供的情况来看,不,你没有陷入僵局。但如果事情悬而未决,并开始备份,那么这是一个很好的可能性,但不可能(或至少很难)从堆栈转储中确定 编辑:等等,它们没有锁定在同一个对象上。但是两个线程都在同一个函数中。我发现这不太可能(单独)导致死锁,但它可能是导致死锁的线程循环的一部分。a(常规)死锁
"Thread-1" prio=10 tid=0x0841ac00 nid=0x77d waiting for monitor entry [0xb42bf000]
java.lang.Thread.State: BLOCKED (on object monitor)
at Deadlock$Friend.bowBack(Deadlock.java:16)
- waiting to lock <0x8b80def8> (a Deadlock$Friend)
at Deadlock$Friend.bow(Deadlock.java:13)
- locked <0x8b80df08> (a Deadlock$Friend)
at Deadlock$2.run(Deadlock.java:28)
at java.lang.Thread.run(Thread.java:619)
"Thread-0" prio=10 tid=0x08419400 nid=0x77c waiting for monitor entry [0xb4310000]
java.lang.Thread.State: BLOCKED (on object monitor)
at Deadlock$Friend.bowBack(Deadlock.java:16)
- waiting to lock <0x8b80df08> (a Deadlock$Friend)
at Deadlock$Friend.bow(Deadlock.java:13)
- locked <0x8b80def8> (a Deadlock$Friend)
at Deadlock$1.run(Deadlock.java:25)
at java.lang.Thread.run(Thread.java:619)
Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x083f1464 (object 0x8b80def8, a Deadlock$Friend),
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 0x083efc90 (object 0x8b80df08, a Deadlock$Friend),
which is held by "Thread-1"
Java stack information for the threads listed above:
===================================================
"Thread-1":
at Deadlock$Friend.bowBack(Deadlock.java:16)
- waiting to lock <0x8b80def8> (a Deadlock$Friend)
at Deadlock$Friend.bow(Deadlock.java:13)
- locked <0x8b80df08> (a Deadlock$Friend)
at Deadlock$2.run(Deadlock.java:28)
at java.lang.Thread.run(Thread.java:619)
"Thread-0":
at Deadlock$Friend.bowBack(Deadlock.java:16)
- waiting to lock <0x8b80df08> (a Deadlock$Friend)
at Deadlock$Friend.bow(Deadlock.java:13)
- locked <0x8b80def8> (a Deadlock$Friend)
at Deadlock$1.run(Deadlock.java:25)
at java.lang.Thread.run(Thread.java:619)
Found 1 deadlock.