私は Web アプリケーションを開発し、jBoss 4.0.2 を使用しています。Eclipse で WAR を数回再デプロイすると、メモリ不足のために jBoss がクラッシュします。また、本番環境に新しいバージョンをインストールする必要がある場合、本番サーバーのメモリが消費されるため、jBoss を停止して、顧客のサーバーからメモリを再展開しないようにする必要があります。この問題の回避策はありますか?
3 に答える
基本的に、いいえ。JBoss クラスローダの動作方法により、各デプロイメントは、アプリケーションがアンデプロイされても解放されない PermGen のチャンクを使い果たします。
PermGen のメモリ プール サイズを数百 MB (またはギグ) に増やすことで、症状を軽減できます。これにより、問題に対処しやすくなります。また、コード内の静的フィールド (特に大きなオブジェクトを参照する静的フィールド) の使用を減らすと、PermGen への影響が軽減されることもわかりました。
理想的には、本番環境ではホット デプロイメントを使用せず、サーバーをシャットダウンし、WAR/EAR を交換してから再起動します。
I'm not sure it's linked, but I suspect it is - JBoss is not J2EE compliant as far as implementing application separation as it comes out of the box.
As it comes, there is one classloader into which all classes are put and thus it is not possible to unload classes and therefore you are going to have this problem. You can configure jboss to be more J2EE compliant in this respect.
Are you getting the "out of memory Permgen" or are you getting regular out of memory?
I also made progress by connecting JProfiler up to it and checking memory usage with this.
I ended up simply restarting Jboss all the time - didn't take up too much time.
これを試してください(SunのJavaに適用されます):
-XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=128m
CMS は、実際に永久世代ヒープ (クラスが存在するヒープ) を GC できます。MaxPermSize の設定は不要ですが、アプリケーション サーバーのデフォルトは低く設定されています。