Javaスレッドダンプで「ロックがリリースされている」とはどういう意味ですか?
-
28-10-2019 - |
質問
このスレッドダンプで:
INFO | jvm 3 | 2011/06/08 13:36:12 | "ExecuteThread: '38' for queue: 'default'" id=55 idx=0x78 tid=5316 prio=5 alive, in native, waiting, daemon
INFO | jvm 3 | 2011/06/08 13:36:12 | -- Waiting for notification on: weblogic/ejb20/locks/ExclusiveLockManager$LockWaiter@0x25EF8828[fat lock]
INFO | jvm 3 | 2011/06/08 13:36:12 | at jrockit/vm/Threads.waitForSignal(J)Z(Native Method)
INFO | jvm 3 | 2011/06/08 13:36:12 | at java/lang/Object.wait(J)V(Native Method)[optimized]
INFO | jvm 3 | 2011/06/08 13:36:12 | at weblogic/ejb20/locks/ExclusiveLockManager$LockBucket.lock(Ljava/lang/Object;Ljava/lang/Object;I)Z(ExclusiveLockManager.java:504)[optimized]
INFO | jvm 3 | 2011/06/08 13:36:12 | ^-- Lock released while waiting: weblogic/ejb20/locks/ExclusiveLockManager$LockWaiter@0x25EF8828[fat lock]
INFO | jvm 3 | 2011/06/08 13:36:12 | at weblogic/ejb20/locks/ExclusiveLockManager.lock(Ljava/lang/Object;Ljava/lang/Object;I)Z(ExclusiveLockManager.java:261)[optimized]
INFO | jvm 3 | 2011/06/08 13:36:12 | at weblogic/ejb20/manager/ExclusiveEntityManager.acquireLock(Ljava/lang/Object;Ljavax/transaction/Transaction;I)Z(ExclusiveEntityManager.java:210)[inlined]
INFO | jvm 3 | 2011/06/08 13:36:12 | at weblogic/ejb20/manager/ExclusiveEntityManager.getReadyBean(Ljava/lang/Object;Ljavax/transaction/Transaction;I)Ljavax/ejb/EntityBean;(ExclusiveEntityManager.java:267)[inlined]
INFO | jvm 3 | 2011/06/08 13:36:12 | at weblogic/ejb20/manager/ExclusiveEntityManager.preInvoke(Lweblogic/ejb20/internal/InvocationWrapper;)Ljavax/ejb/EnterpriseBean;(ExclusiveEntityManager.java:242)[optimized]
INFO | jvm 3 | 2011/06/08 13:36:12 | at weblogic/ejb20/internal/BaseEJBObject.preInvoke(Lweblogic/ejb20/internal/InvocationWrapper;Lweblogic/security/service/ContextHandler;)Lweblogic/ejb20/internal/InvocationWrapper;(BaseEJBObject.java:152)[inlined]
INFO | jvm 3 | 2011/06/08 13:36:12 | at weblogic/ejb20/internal/EntityEJBObject.preInvoke(Lweblogic/ejb20/internal/MethodDescriptor;Lweblogic/security/service/ContextHandler;)Lweblogic/ejb20/internal/InvocationWrapper;(EntityEJBObject.java:104)[inlined]
INFO | jvm 3 | 2011/06/08 13:36:12 | at foob/ejb/commodity/ejb_Commodity_etfd4i_EOImpl.getData()Lfoob/ejb/commodity/db/CommodityData;(ejb_Commodity_etfd4i_EOImpl.java:701)[optimized]
INFO | jvm 3 | 2011/06/08 13:36:12 | at foob/ejb/item/OurItem.loadCommodityData()V(OurItem.java:172)[optimized]
INFO | jvm 3 | 2011/06/08 13:36:12 | ^-- Holding lock: java/lang/Class@0x067EA070[fat lock]
INFO | jvm 3 | 2011/06/08 13:36:12 | at foob/ejb/item/OurItem.getCommodityData()Lfoob/ejb/commodity/db/CommodityData;(OurItem.java:251)
INFO | jvm 3 | 2011/06/08 13:36:12 | at foob/ejb/item/OurItem.getTheControlGid()Ljava/lang/String;(OurItem.java:259)
INFO | jvm 3 | 2011/06/08 13:36:12 | at foob/business/shipment/OurThing.getTheControlGid(Lfoob/util/jdbc/OurConnection;)Ljava/lang/String;(OurThing.java:379)
ラインは何ですか
Lock released while waiting: weblogic/ejb20/locks/ExclusiveLockManager$LockWaiter@0x25EF8828
平均?他の8つのスレッドが待機していました java/lang/Class@0x067EA070
このスレッドが保持しているリリースされますが、このスレッドが何をブロックしているのか、ロックがリリースされたことを意味することはわかりません。スレッドダンプは世界の停止タイプのイベントであると思っていたので、問題のラインは、スレッドダンプが発生している間にリリースされるロックを参照しません...
また、表示される場所には重要なことがありますか(つまり、その上とその下の行)?
明らかに私はJavaを期待していないので、これがあまりにも愚かではないことを願っています。助けてくれてありがとう!
解決
から Oracle Jrockit JDK Tools Guide,
Javaのオブジェクトを(通知のために)待機するためのセマンティクスはやや複雑です。まず、同期ブロックを入力するには、オブジェクトのロックを取得し、そのオブジェクトのwait()を呼び出す必要があります。待機方法では、スレッドが通知を待って眠りにつく前にロックが解放されます。スレッドが通知を受信したら、戻る前にロックを再テーブします。スレッドがロックを取得し、そのロックについての通知を待っている場合、ロックが使用されたときに説明されているスタックトレースのラインが(ロックを保持している)として表示されません。 それは(待機中にロックがリリースされるロック)として表示されます。
言い換えれば、それは上記のスレッドに以前にロックを取得したオブジェクトがあることを意味し、その後、後の時点でそれが呼び出されたときにそれをリリースしたことを意味します object.wait()
. 。動作に似たコードのパターンは次のとおりです。
synchronized(lock) //acquires the lock
{
...
do some work
...
object.wait(); //releases the lock, and waits for a notification
}
アップデート
スタックトレースを見ると、エンティティEJB豆を使用しているように見え、そのような実装の動作方法を考えると、通常、エンティティEJBでロックが取得されます。これは実際にはに依存します 同時実行戦略 データベースにアクセスする必要がある同時トランザクションの管理に使用されます。豆の数が低すぎるか、ロックする豆が1つしかないと思われます。
他のヒント
このページで「リリースされたロック」を検索すると、オブジェクト上で待機する論理内で何が起こっているかについてかなり良い説明が提供されます。
http://download.oracle.com/docs/cd/e13188_01/jrockit/docs142/userguide/apstkdmp.html
このメッセージは、notify()edがオブジェクトのロックをrecappappappaptify()を取得する元のwait()callが時を表しているようです。
将来のリファレンスのために、私はこれを「待機中にロックリリース」でGoogle検索を行うだけで見つかりました。これが現れた最初のページでした...うまくいけば、あなたはすでにネットで検索を行っていて、あなたが何に満足していなかったのですかこの場合、これが役に立たない場合は申し訳ありません。
上記の2行に関連する可能性が最も高いです。
at java/lang/Object.wait(J)V(Native Method)[optimized]
wait()は、現在保持されているロック(周囲の同期ブロックが保持しているロック)を放出し、notify()信号を待ちます。