モニターでロックを待機しているスレッドを示す JVM スレッド ダンプの原因は何ですか?
Windows 2003 上の Java 1.5_14
あなたのコードは変更によって JNI を使用していますか? (つまり、Java から起動されたネイティブ コードを実行していますか?)。
同様の動作が確認されていますが、JDK 1.6.0_05. アプリはデッドロックしているように見えますが、Jstack は、他のスレッドが保持していないロックを待機しているスレッドを示しています。いくつかの JNI コードがあるため、何かが破損している可能性があります。
これに対する解決策は見つかっておらず、この問題は 1 台のマシンでのみ再現可能です。
それらの待機中のスレッドは永遠に待機しますか、それとも最終的に続行しますか?
後者の場合、ガベージ コレクタによってロックが保持されている可能性があります。
Java コマンドラインに引数を追加して-verbose:gc with -XX:+PrintGCDetails
、GC が発生したときに通知することができます。gc アクティビティがスローダウンと一致する場合は、これが問題であることを示している可能性があります。
ガベージ コレクションに関する情報を次に示します。
これは単なる推測ですが、スレッドがロックを 2 回取得しようとすることで、スレッド自体がロックされる可能性はありますか? おそらく、いくつかのコードを投稿していただけると助かります。
はい、通常、ロックされている各モニターには所有者スレッドが必要です。スタック ダンプが完了していない (長すぎる) か、ダンプが一貫していない可能性があります。ロックされたモニターはダンプされますが、ロックを所有するスレッドはダンプされる前にそれを解放します (これは単なる推測です)。
簡単に検索できるように、ダンプをテキスト ファイルとしてアップロードする場所を教えてください。また、どのモニターを見ているか教えてください。
今日も同様の問題があり、静的リソースへのアクセスも含まれていました。
短いバージョンは、AWT TreeLock によってブロックされた静的ブロック内および AWT-EventQueue スレッドの外側でクラスが GUI の変更を行った後、EventQueue がブロックされたクラスへの参照を作成したことです。そのクラスのクラスローダーのモニター。
ここで重要な観察事項は、クラス ローダーのロックがスレッド ダンプでロックされていると表示されないことです。
完全な答えは、このスレッドにあります。
Java 1.6 にアップグレードしてみましたか? 1.5 のみを使用している場合、バグが問題になる可能性があります。