2011-01-19 19 views
3

J2EEアプリケーションのパフォーマンスが低下しています。私たちはその状況でThead Dumpsをとり、次のスレッドが複数のダンプでRunnableであり、他のスレッドが(直接的または間接的に)ロックを待っているいくつかのモニターをロックしていることがわかりました。ハングしたスレッドjava.lang.ClassLoader.findBootstrapClass

at java.lang.ClassLoader.findBootstrapClass(Native Method) 
at java.lang.ClassLoader.findBootstrapClass0(ClassLoader.java:891) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:301) 
    - locked [0x9747c360] (a sun.misc.Launcher$ExtClassLoader) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:299) 
    - locked [0x9747c318] (a sun.misc.Launcher$AppClassLoader) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268) 
    - locked [0x9747c318] (a sun.misc.Launcher$AppClassLoader) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:251) 
..... 

このスレッドは動いておらず、他のスレッドを動作させることができますか?

+1

あなたが使用するjavaとアプリケーションサーバーのバージョンを教えてくれれば助かります。他のスレッドは、通常のクラスローダーロックを待っていますが、ネイティブメソッドで特定のスレッドがどのようにブロックされると、ハードウェア/ディスクの問題やjarファイルの破損の可能性があります。デバッグでアプリケーションサーバーを起動し、プロセスを一時停止して、どのクラスが原因であるかを確認することができます。 – bestsss

+0

@bestsss Java:1.5。 AppServer:WAS 7.0 –

+0

スローダウンはいつ発生しますか?起動直後またはシステムがしばらくまたは無作為に実行された直後ですか? WAS自身と親密ではありませんが、デバッグ関連のすべてのパラメータがオフで、デプロイ後にアプリを変更するものは何もないことを確認したいと思います。 websphereがアプリケーションを何度も再読み込みできるようです。 – CurtainDog

答えて

1

あなたのアプリは非常に多くのクラスをロードしています(ロックはloadClassにあります)。あなたのアプリは、初期化とウォームアップの間だけアンロードされたクラスをロードすることが期待されます。

  • は、あなたが代わりにそれらを再利用しようとしているの異なるダイナミックプロキシクラスの多くを作成している:

    だから、私は、次のいずれかが起こっていると思われます。

  • 不必要に多くのClassLoaderを作成しているか、少なくともそれらを悪用しています。
  • 複数の並列JVMを開始して終了しています。

これらのことはいずれも非常に高価であり、可能な限り避けなければならないことは言うまでもない。

+0

ありがとうございました。しかし、我々は上記の3つの事柄のいずれかを使用していません。私たちのアプリケーションは、カスタマイズされたクラスローダーを使用せず、デフォルトのクラスローディングメカニズムを利用する、まっすぐなJ2EEアプリケーションです。 また、初期化中にアプリケーションが多くのクラスをロードすることに同意しますが、本番環境での起動後は問題の動作が長すぎます。 Perm-Gen問題のメモリスペースのためにこれが問題になる可能性があると思われますが、これはperm-genスペースを増やし、それを監視しても問題ないと思われます。 –

+0

Java VMは、初めて使用されるときにクラスを動的にロードします。ウォームアップ中にほとんどのクラスが読み込まれる可能性がありますが、アプリが以前に開かれていないパスを取得する要求は、追加のクラスを読み込む可能性があります。完全なスレッドダンプは、クラスのロードをトリガーした原因を指摘します。 – Cagatay

0

このスレッドが一時停止されている場合無期限に私は、ある種の循環参照(symlinks?other?)を推測します。

ロードされたクラスのロギングを有効にすると、詳細を調べることができます。

java -verbose:class your.Class 

これはあなたに多くのことを示すかもしれません。私はsystem.outに書き込むと思うので、適切なログをチェックインする必要があります。

1

OSGIでは、このようなことが起こりました。クラスローダー構造は、通常のJ2EEと同じようにツリーではなくグラフです。クラスローダーはクラスをロードするときにロックされるため、(x、y)および(y、x)の順でクラスローダーからクラスをロードする2つのスレッド(a、b)がそれぞれデッドロックする可能性があります。これは、静的初期化子が他のクラスローダーからより多くのクラスローディングを引き起こす場合に発生します。ブートストラップクラスがアプリケーションクラスローダーからのクラスローディングを引き起こすことは頻繁ではありませんが、スレッドコンテキストローダーを使用する標準ライブラリのファクトリクラスはすべてこの請求書に適合します。通常の解決策は、アプリの起動時にクラスを先に読み込むことです。そのため、サイクルが壊れます。

関連する問題