struts2、spring、および JasperReport を使用する Java で作成された Web アプリケーションがあります。このアプリケーションは、glassfish 4.0 で動作します。
アプリケーションのライブラリは WEB-INF/lib フォルダーにあり、glassfish にも同じライブラリを使用する 4 つ以上がインストールされています。
Glassfish は、ヒープスペースに 1024mb、permgen に 512m を使用するように構成されています。アプリケーションごとにライブラリを使用する場合のメモリ消費のほとんどは、struts アクションと spring aop クラス (netbeans プロファイラーを使用) にあります。
私たちが抱えている問題は、アプリケーションごとにクラスローダにライブラリを配置することによって消費されるメモリの量です。これは、あまりにも多く、PermGen エラーが発生するためです。また、ユーザが増えるとアプリケーションの実行が遅くなることにも気付きました。
そのため、共有ライブラリを使用しようとし、それを domain1/lib フォルダーに配置しました。デプロイされた単一のアプリケーションでは、ロード時間とメモリ消費がはるかに低く、アプリケーションは一般的に高速に動作することがわかりました。しかし、残りのアプリケーションをサーバーにデプロイすると、ロードされた最初のアプリケーションのみが正常に機能し、struts2 アクションを呼び出すと残りのアプリケーションにエラーが発生します。これは、アプリケーションごとに struts2 と log4j の設定が若干異なるためだと考えています。
また、特定のライブラリのみを Glassfish に配置し、struts2 のみをアプリケーションに残そうとしましたが、すべてのライブラリが apache-common のライブラリに依存しており、それらのライブラリをどこに配置しても問題にならないため、InvocationTargetException エラーが表示されます。また、両方の場所に配置すると、アプリケーションは起動しません。
- 共有ライブラリを使用するための特別な設定やベスト プラクティスはありますか?
- 共有ライブラリを使用するが、アプリケーションごとに設定をロードする方法はありますか? または、すべて同じにするために設定を変更する必要がありますか?