8

Tomcat 6.0.28 および OpenJDK ランタイム環境 (IcedTea6 1.11.11) で実行される新しいバージョンの Java EE Web アプリケーションに対して、いくつかのソーク テストを実行しました。問題は Web 層で発生します。

しばらくすると (初回は 50 分、2 回目は 1 時間、3 回目は 2.5 時間)、クラスター化された Web 層の 1 つのランダムな Tomcat が応答を停止します。スレッド ダンプを見ると、多数のスレッドが突然ブロックされていることがわかります。

この問題が発生すると、スレッドの数が 93 から 437 に増加します。437 のスレッドのうち 341 が、次のように WebappClassLoader でブロックされます。

"TP-Processor400" daemon prio=10 tid=0x00007f1ee432e800 nid=0x44d9 waiting for monitor entry [0x00007f1ec47c5000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java)
        - waiting to lock <0x00000006f561a758> (a org.apache.catalina.loader.WebappClassLoader)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1329)

1 つのスレッドがロックを保持します。

"TP-Processor53" daemon prio=10 tid=0x00007f1ee406f800 nid=0x7cbf runnable [0x00007f1f4545b000]
   java.lang.Thread.State: RUNNABLE
        at java.lang.ClassLoader.findLoadedClass0(Native Method)
        at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:923)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1386)
        - locked <0x00000006f561a758> (a org.apache.catalina.loader.WebappClassLoader)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1329)

1 分間隔での後続のスレッド ダンプは、ロックが解放され、別のスレッドによって取得されていることを示しています。2 分後、ブロックされたすべてのスレッドのブロックが解除され、サーバーは再び正常に動作します。

WebappClassLoader のデッドロックの問題は、Tomcat バグ トラッカーで、独自のクラス ローダーを使用するアプリケーションで報告されています ( https://issues.apache.org/bugzilla/show_bug.cgi?id=48694はhttps://issuesの複製です) 。 .apache.org/bugzilla/show_bug.cgi?id=48903 )、これは私たちにも当てはまります: 私たちのアプリケーションは、org.opencms.ocee.base.CmsReloadingClassLoader を使用してクラスをロードするクラスター化された OpenCMS インストールに組み込まれています。

ブロッキングが発生すると、GC アクティビティが CPU 時間の 10% から 50% に増加することもわかりますが、その時点ではメモリとヒープは増加しません。

質問は、このブロックの原因は何ですか?それを修正するにはどうすればよいですか?

4

1 に答える 1