Tomcat 6 は Web アプリケーション全体でキャッシュしますか?

Tomcat 6 は Web アプリケーション全体でキャッシュしますか?

私は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

圧縮版は誰かによって書かれていますこれページ。

関連情報