クラス IntrospectorCleanupListener

java.lang.ObjectSE
org.springframework.web.util.IntrospectorCleanupListener
実装されたすべてのインターフェース:
ServletContextListenerEEEventListenerSE

public class IntrospectorCleanupListener extends ObjectSE implements ServletContextListenerEE
Web アプリのシャットダウン時に JDK の JavaBeans IntrospectorSE キャッシュをフラッシュするリスナー。このリスナーを 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 の最初のリスナーとして登録する必要があります。これにより、リスナーはライフサイクルの適切なタイミングで最大限の効果を発揮できます。

導入:
1.1
作成者:
Juergen Hoeller
関連事項: