
私は4GBのUbuntu 12.04サーバー上にTomcat 6サーバーと次のJAVA_OPTSを持っています
JAVA_OPTS="-Djava.awt.headless=true -Xms512M -Xmx512M -XX:PermSize=1024M -XX:MaxPermSize=1024M -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled"
愚かな質問ですが、同じ Web アプリケーション (同じ war ファイル) を複数回デプロイすると (それぞれ異なる Postgres データベースを参照)、server.com:8080/webapp1、server.com:8080/webapp2 などになります...
Tomcat は複数の Web アプリケーションにわたってクラス ファイルを 1 回キャッシュすると想定してよいでしょうか。それとも、Tomcat は Web アプリケーションごとにクラスをキャッシュするのでしょうか。
よろしくお願いしますダニー
答え1
答えは、Web アプリケーションで使用されるクラス ファイルをどこに配置したかによって異なります。
特定のクラスを $CATALINA_HOME/lib の Tomcat 共通クラス ローダー パスに配置すると、すべての Web アプリケーションで使用できるようになります。キャッシュされた形式でも同様です。
Tomcat Webアプリケーションクラスローダーパスwebapps/を使用する場合ウェブアプリ/WEB-INF/クラスとウェブアプリケーション/ウェブアプリ/WEB-INF/lib クラスと対応するクラス キャッシュはアプリケーション間で分離されます。
技術的背景
Tomcat は Java がネイティブにクラスを処理する方法に準拠せず、カスタム Java クラス ローダーを使用します。これは、次の機能に関連するいくつかの機能を強化するためです。
- ウェブアプリケーション内のクラス処理
- ウェブアプリケーションごとのクラスキャッシュ
- Webアプリケーションの起動/実行時にクラスをプリロードおよびリロードする
- クラスのロード/参照におけるセキュリティ
Tomcat カスタム クラス ローダーは、Java のデフォルトの Bootstrap、Extension、および System クラス ローダーを使用しますが、System クラス ローダーが使用するクラスパス変数を独自のクラスパスに置き換えます。これにより、次の効果が得られます。
- Java に同梱されている Endorsed Standards Override Mechanism を Tomcat 独自のものに置き換えます。
Java クラス ローディング階層の最後に 2 つのクラス ローダーを追加します。
- Tomcat 共通クラスローダー
- ウェブアプリケーションごとに個別のクラスローダー
元のクラスパスは Tomcat によって無視されます。
重要な点は、Web アプリケーション クラス ローダーはクラスのロードを最初に親に委任するのではなく、要求されたときに各クラスをロードしようとすることです。ロードされた各クラスは、その後、該当する Web アプリケーション クラス ローダーによってキャッシュされます。このクラスローダー/キャッシュ レベルは、Web アプリケーション間で共有できません。
共通クラス ローダーによってロードされるすべてのクラスは、キャッシュを含め、すべての Web アプリケーションで公開されます。共通クラス ローダー パスにクラスを広範囲に配置することは、次の理由から推奨されません。
- ポータビリティが損なわれる
- クラス バージョン要件は、Tomcat とさまざまな Web アプリケーション間で異なる場合があります。
- メンテナンスが問題になる場合、どのクラスが何に属していたか?
クラスのロード/キャッシュ/リロードのプロセスには、かなり細かい記述が伴います。それが重要な場合は、クラスのロードに関する優れた章を読むことをお勧めします。プロフェッショナル Apache Tomcat 6。
圧縮版は誰かによって書かれていますこれページ。