2

Java(Web)アプリケーションはJBoss6xで実行されます。遅さが報告されたとき:

  1. スレッドスタックダンプが取得されました(詳細は以下を参照)
  2. メモリを調べました-メモリ使用量が非常に高く、最大許容ヒープサイズにほぼ達していることがわかりましたが、メモリ不足はありませんでした。

スレッドスタックダンプは、次の種類のエラーでロギングでブロックされたほとんどのスレッドを表示します。

waiting for monitor entry [0x000000004b6be000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at org.jboss.logmanager.handlers.WriterHandler.doPublish(WriterHandler.java:59)
    - waiting to lock <0x00002aaac9a2de68> (a java.lang.Object)
    at org.jboss.logmanager.ExtHandler.publish(ExtHandler.java:64)

そしてこのように:

   java.lang.Thread.State: BLOCKED (on object monitor)
    at java.io.PrintStream.println(PrintStream.java:756)
- waiting to lock <0x00002aaac9817a08> (a com.whatever.SomeClass)
at com.something.ThatClass.thatMethod(ThatClass.java:169)

com.whatever.SomeClassはorg.apache.log4j.Logger
を使用しますロギングにはLog4jを使用します。

一部のロギング操作でスレッドがすべてブロックされているようです。この問題は過去にも発生しており、ランダムに表示され、アプリケーションの速度が低下したり停止したりします。

何か案は?

4

1 に答える 1

3

Jasper、すべてのロギング フレームワークには、データをディスクに書き込む同期ブロックがあります。これは、複数のスレッドがログに書き込んでいるときにログが文字化けするのを防ぐためです (この例を投稿しました - BLOCKED スレッド on java.io.PrintStream.println)。

しかし、非同期アペンダーを使用するという解決策があります。職場では、高スループット/低遅延のアプリケーションがいくつかあり、スレッドの競合を防ぐためにこれを構成する必要がありました。

非同期アペンダーを使用しているときに考慮する必要があることの 1 つは、アプリがクラッシュしたり、強制的に終了した場合、ログに最後のログ ステートメントが表示されないことです。おそらくディスクに書き込まれていないためです。 .

于 2013-02-07T08:46:18.037 に答える