JBoss をアプリケーション サーバーとして Java/J2EE プロジェクトに取り組んでいます。
戦争を構築し、Jenkins を使用してサーバーでホット デプロイメントを行います。時々、JBoss でメモリ不足エラーが発生します。
ホットデプロイメントがその原因なのだろうか。また、ホット デプロイに通常の手動の開始/停止デプロイにはない落とし穴があるかどうかを知りたいです。
誰かが貴重な情報を提供してもらえますか?
ヒープ/permgenスペースの調整に関する回答に同意しますが、許可されているメモリの量、使用しているものなどに関する詳細情報がないと具体的にするのは困難です.
また、ホット展開に通常の手動の開始/停止展開よりも落とし穴があるかどうかを知りたいです。
展開の間にサービスを手動で開始および停止すると、Web アプリのクリーンアップが少しずさんになる可能性がありますが、それは誰にもわかりません。
ホット デプロイすると、サーブレット コンテキストの以前のインスタンスは破棄されます。OutOfMemory 例外の頻度を減らすために、これが発生したときに自分でクリーンアップする必要があります。クラスローダの PermGen メモリの問題については何もできませんが、追加のメモリ リークを導入して問題を悪化させたくはありません。
たとえば、war ファイルがワーカー スレッドを開始する場合、これらを停止する必要があります。JNDI でオブジェクトをバインドする場合、オブジェクトはバインド解除されている必要があります。開いているファイル、データベース接続などがある場合は、これらを閉じる必要があります。
Spring のような Web フレームワークを使用している場合、その多くはすでに処理されています。Spring は、サーブレット コンテキストが破棄されたときにコンテナーを自動的に停止する ServletContextListener を登録します。init
ただし、リソースを作成するすべての Bean がdestroy
.
手作りのサーブレットを実行している場合は、web.xml ファイルに ServletContextListener の実装を登録し、contextDestroyed
リソースをクリーンアップする実装に登録する必要があります。
ところで - 正確な OutOfMemory 例外を回答に含める必要があります。のような場合はjava.lang.OutOfMemoryError: PermGen space
、おそらくクラス インスタンスの問題であり、できることはあまりありません。その場合java.lang.OutOfMemoryError: Java heap space
、おそらくクリーンアップされていないのはアプリケーションのメモリです
ヒープスペース、特にパーマスペースを増やす必要があります
-Xms<size> set initial Java heap size
-Xmx<size> set maximum Java heap size
-XX:MaxPermSize set maximum Permanent generation size
JAVA_OPTS
jbossrun.sh
などで設定できますrun.bat
。
-Xms256m -Xmx1024m -XX:MaxPermSize=512m
ホット デプロイメントは、以前に Perm Gen にロードされた Class インスタンスをクリアしません。Class インスタンスを新たにロードします。少しグーグルが私をSOに戻しました何がホットデプロイメントを「難しい問題」にするのですか?