13

Tomcat で Java EE ベースのアプリケーションを実行していますが、数時間実行した後、アプリケーションが突然ハングします。

ハングする直前にアプリケーションからスレッド ダンプを収集し、分析のために TDA に入れました。

ここに画像の説明を入力

TDA (スレッド ダンプ アナライザー) は、上記のモニターに対して次のメッセージを表示します。

A lot of threads are waiting for this monitor to become available again.
This might indicate a congestion. You also should analyze other locks 
blocked by threads waiting for this monitor as there might be much more 
threads waiting for it.

上記で強調表示されたスレッドのスタックトレースは次のとおりです。

"MY_THREAD" prio=10 tid=0x00007f97f1918800 nid=0x776a 
             waiting for monitor entry [0x00007f9819560000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at java.util.Hashtable.get(Hashtable.java:356)
    - locked <0x0000000680038b68> (a java.util.Properties)
    at java.util.Properties.getProperty(Properties.java:951)
    at java.lang.System.getProperty(System.java:709)
    at com.MyClass.myMethod(MyClass.java:344)

"waiting for monitor entry"状態が何を意味するのか知りたいです。また、この問題のデバッグに役立つポインタをいただければ幸いです。

4

4 に答える 4

6

スレッドの1つがモニターオブジェクト(オブジェクトの排他ロック)を取得しました。これは、スレッドが同期されたコードを実行していて、何らかの理由でそこでスタックし、他のスレッドを待機している可能性があることを意味します。ただし、他のスレッドは、同期されたブロックに遭遇してロック(モニターオブジェクト)を要求したため、実行を続行できませんが、他のスレッドによって解放されるまでロックを取得できません。だから...おそらくデッドロック。

于 2012-07-05T14:57:38.940 に答える
2

スレッド ダンプ全体からこの文字列を探してください

- ロックされた <0x00007f9819560000>

見つかればスレッド「tid=0x00007f97f1918800」でデッドロック状態

于 2012-07-05T15:27:55.410 に答える
1

モニター = 同期。同じオブジェクトのロックを取得しようとするスレッドが多数あります。

たぶん、Hashtable の使用から切り替えて、HashMap を使用する必要があります

于 2012-07-05T14:51:00.730 に答える
1

これは、スレッドが (Hashtable に) ロックを設定しようとしているが、他のスレッドが既にアクセスしており、ロックを設定していることを意味します。つまり、ロックが解除されるのを待っています。他のスレッドが何をしているかを確認してください。特に tid="0x00007f9819560000" のスレッド

于 2012-07-05T14:55:05.290 に答える