public class IntrospectorCleanupListener extends ObjectSE implements ServletContextListenerEE
JavaBeans Introspector
SE キャッシュをフラッシュするリスナー。このリスナーを web.xml
に登録して、Web アプリケーションクラスローダーとそのロードされたクラスの適切なリリースを保証します。JavaBeans Introspector を使用してアプリケーションクラスを分析した場合、システムレベルの Introspector キャッシュはそれらのクラスへのハード参照を保持します。その結果、それらのクラスと Web アプリケーションクラスローダーは、Web アプリのシャットダウン時にガベージコレクションされません。このリスナーは、適切なクリーンアップを実行して、ガベージコレクションを有効にします。
残念ながら、イントロスペクターをクリーンアップする唯一の方法はキャッシュ全体をフラッシュすることです。そこで参照されるアプリケーションのクラスを具体的に決定する方法はないためです。これにより、サーバー内の他のすべてのアプリケーションのキャッシュされたイントロスペクション結果も削除されます。
アプリケーション内で Spring の Bean インフラストラクチャを使用する場合、このリスナーは必要ないことに注意してください。Spring 自体のイントロスペクション結果キャッシュは、JavaBeans イントロスペクターキャッシュから分析されたクラスをすぐにフラッシュし、アプリケーション自体の ClassLoader 内のキャッシュのみを保持します。Spring 自体は JDK Introspector リークを作成しませんが、Spring フレームワーククラス自体が「共通の」ClassLoader(システム ClassLoader など)に存在するシナリオでは、このリスナーを使用する必要があることに注意してください。このようなシナリオでは、このリスナーは Spring のイントロスペクションキャッシュを適切にクリーンアップします。
アプリケーションクラスが JavaBeans Introspector を直接使用する必要はほとんどないため、通常は Introspector リソースリークの原因ではありません。むしろ、多くのライブラリとフレームワークは Introspector をクリーンアップしません。Struts および Quartz。
このような 1 つの Introspector リークにより、Web アプリのクラスローダー全体がガベージコレクションされないことに注意してください。これにより、Web アプリケーションのシャットダウン後に、アプリケーションのすべての静的クラスリソース(シングルトンなど)が表示されますが、これらのクラスのせいではありません。
このリスナーは、Spring の ContextLoaderListener などのアプリケーションリスナーの前に、web.xml
の最初のリスナーとして登録する必要があります。これにより、リスナーはライフサイクルの適切なタイミングで最大限の効果を発揮できます。
コンストラクターと説明 |
---|
IntrospectorCleanupListener() |
修飾子と型 | メソッドと説明 |
---|---|
void | contextDestroyed(ServletContextEventEE event) ServletContext がシャットダウンされようとしているという通知を受け取ります。 |
void | contextInitialized(ServletContextEventEE event) Web アプリケーションの初期化プロセスが開始されているという通知を受け取ります。 |
cloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSE
public void contextInitialized(ServletContextEventEE event)
javax.servlet.ServletContextListenerEE
Web アプリケーションのフィルターまたはサーブレットが初期化される前に、すべての ServletContextListeners にコンテキストの初期化が通知されます。
ServletContextListenerEE
の contextInitializedEE
event
- 初期化されている ServletContext を含む ServletContextEventpublic void contextDestroyed(ServletContextEventEE event)
javax.servlet.ServletContextListenerEE
ServletContextListeners にコンテキスト破棄が通知される前に、すべてのサーブレットとフィルターが破棄されます。
ServletContextListenerEE
の contextDestroyedEE
event
- 破棄されている ServletContext を含む ServletContextEvent