6

JVM は、デッドロックが発生したことを通知します。

Found one Java-level deadlock:
=============================
"TP-Processor107":
  waiting for ownable synchronizer 0x00002aaaf58e70f0, (a java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync),
  which is held by "indexTrackerThread3"
"indexTrackerThread3":
  waiting for ownable synchronizer 0x00002aaaf4394580, (a java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync),
  which is held by "TP-Processor16"
"TP-Processor16":
  waiting for ownable synchronizer 0x00002aaaf58e70f0, (a java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync),
  which is held by "indexTrackerThread3"

indexTrackerThread3がによって保持されているリソースを待機していることがわかりますTP-Processor16。また、その逆も同様です。それはまさにデッドロックです。

indexTrackerThread3を待っていることがわかります0x00002aaaf4394580:

"indexTrackerThread3":
    - parking to wait for  <0x00002aaaf4394580>

私の質問:

スレッド ダンプに行がないのはなぜ- locked <0x00002aaaf4394580>ですか?

0x00002aaaf58e70f0 は実際にはどのスレッドにもロックされていないようです。何がそれをロックしている可能性がありますか?

私が読んだすべてのデッドロック ドキュメント ( example ) では、異なる行ごと- parking to wait for <0x123>に常に 1- locked <0x123>行あります。そこで、JVM のバグを疑い始めました。私は何か誤解していますか?

注: ペーストビンにリンクして申し訳ありませんが、完全なダンプがなければ質問に答えることはできません。簡潔にするために、" at" を含むすべての行を削除しました。これらの行にはロック情報は含まれていません。

4

5 に答える 5

4

java.util.concurrent パッケージは、言語外のネイティブ パーキング メカニズム (およびアトミック コンペア アンド スワップなどの他のネイティブ メカニズム) を利用します。私がここで話していることを見ることができます。

スレッド ダンプで通常発生すると説明するパターンは、従来の Java イディオムに由来しますsynchronized(lock) { lock.wait(); }

于 2012-06-28T07:31:29.890 に答える
0

Marko Topolnik の答えは正しいです。

問題の解決策として、JProfilerはスレッドの完全なグラフを表示し、java.util.concurrent パッケージからのロックを伴うロック状況を監視します。

免責事項: 私の会社は JProfiler を開発しています

于 2012-06-28T08:29:33.390 に答える
0

さまざまな原因で Java スレッドがデッドロックする可能性があります。モニター、別名 Synchronized キーワードは、その 1 つにすぎません。

ロックは、組み込みオブジェクト モニター、所有可能なシンクロナイザー、またはシンクロナイザーに関連付けられた Condition オブジェクトにすることができます。

詳細については、ThreadMXBean.findDeadlockedThreads および ThreadMXBean.findMonitorDeadlockedThreads の定義を掘り下げることもできます。

私に関する限り、それはモニターのロックと Java 5 のロックです。

スレッド ダンプでは、waiting to lock <0x123>とのlocked <0x123>組み合わせはモニターのロック専用です。Java 5 のロックでは、最初の部分しか取得できません。のようなものparking to wait for <0x456>。次に、スレッド ダンプで 0x456 を検索しますが、どこにも見つかりません。これは紛らわしいです。

于 2012-09-07T05:22:25.610 に答える