で、深春シリーズサーティーンの理解:IntrospectorCleanupListenerが解決

 

イントロスペクタの役割と影響力

IntrospectorCleanupListenerを分析する前に、最初のイントロスペクターを見て。イントロスペクタクラスは、ターゲットJavaBeanのための標準的な方法の元のクラスのメソッド、プロパティ、およびイベントの理解を提供するJDKいるjava.beansパッケージ、下にあります。イントロスペクターはのBeanInfoオブジェクトを構築することができ、そしてこのオブジェクトはBeanInfoクラスのプロパティ、メソッド、およびイベントの説明は、その後、あなたはのBeanInfoをターゲットに反対、これは関連する操作をオブジェクトを使用することができ、ターゲットが含まれていることで、素人の観点から、で。

簡単な例で見てみましょうは非常に理解しやすいだろう。簡単にするために、Studentクラスは名前だけの属性です。

 

 

 
结果输出:Student{name='张三'}

ソースコードを見て方法Introspector.getBeanInfoのBeanInfoオブジェクトを構築するための時間に、イントロスペクターを見つけるだろうし、オブジェクトは、次のようにソースコードがあるマップに元のクラスのBeanInfoキャッシュを構築することになります。

 

コードによって上に描画することができ、Introspectorの間接のBeanInfoへの強い参照を保持しています。あなたが運転のIntrospectorクラスの多くを使用している場合は、イントロスペクターは間接的にこれらのBeanInfoの強い参照を保持します。ガベージコレクションが発生した場合には、チェーンのBeanInfoこれらの参考文献の存在を検出し、これらのクラスと、対応するクラスローダは、メモリリークにつながる、ごみ収集されません。したがって、この問題を解決するための操作が完了した後にIntrospectorを使用するために、キャッシュをクリアするflushCachesのIntrospectorクラスのメソッドを呼び出します。

 

上記のコードによって、あなたはキャッシュがすべてのアプリケーションのためにクリアされたときにクリアし、各キャッシュに属しているアプリケーションを判断するためには良い方法はありませんので、クリアされている全体のキャッシュをクリアする時間を見つけるでしょう。

IntrospectorCleanupListenerの決意

上記の役割と影響イントロスペクターの分析、およびIntrospectorCleanupListenerイントロスペクターが、それは何を問題ではないこと?
IntrospectorCleanupListenerはソースとして、春・ウェブジャークラスです。

 

contextInitialized方法のServletContextを破壊したときIntrospectorCleanupListenerが実行され、すなわち、(フィルタまたはサーブレットは、初期化前と言って正確な)Webコンテナの初期化のServletContextListenerインタフェースを実現(言って正確そのフィルタとサーブレットの破壊後)場合実行メソッドをcontextDestroyed。図contextDestroyed方法から、キャッシュを空に対応するServletContextと呼ばれるIntrospector.flushCaches方法の破壊の時に見ることができます。IntrospectorCleanupListenerなぜそれを行いますか?春は使用Introspectorの操作後にキャッシュを空に対応していないされていますか?ビューIntrospectorCleanupListenerクラスのソースコードは、次のようにAのマークがあるでしょう。

 

リスナーがあるため、独自の内部機構の春自体、春を使用している場合、これを使用する必要がないことの効果はすぐに対応するキャッシュをクリアします。が、春自体は、それほど問題はありませんが、他のフレームワークと組み合わせて使用​​する場合には他の人がなどのStruts、クォーツ、としてこの問題の枠組みを、持っていながら、あなたはのServletContextの破壊の対応時にキャッシュを空に、リスナーを構成する必要があります。

もう一つ注意すべきは、シンプルなイントロスペクターのメモリリークのような、つまり、この要因を考慮して、メモリリークの問題がある場合、アプリケーション全体のクラスローダは、ごみ収集されません原因となります。

設定IntrospectorCleanupListener

以前の仕事の経験では、我々は繰り返し非最初IntrospectorCleanupListenerリスナーに配置されたweb.xmlファイルを参照してください。

 

実際に、私はソースがあることを知って読んで公式声明は、このリスナーは、web.xmlの最初のリスナーに設定する必要がありますされ、適切なタイミングで、最も効果的な役割を果たすことができます。

その理由は単純で、Servlet3.0仕様の前に、リスナーの呼び出しはランダムですが、始めServlet3.0から、シーケンスを呼び出して、リスナーがリスナーに応じて、web.xmlで、その構成の順序であるとのServletContextListenerを達成するために、メソッド呼び出しのcontextInitialized正シーケンス順序を順次web.xmlに配置された順序で実行され、呼び出しシーケンスはcontextDestroyedプロセスは、逆web.xmlに連続して配置順に行われます。だから、IntrospectorCleanupListenerが設定されている場合、それはそれは最も効果的な捕捉効果が再生されます、contextDestroyedメソッドの実行を続く、最初のリスナーになりました。そうでない場合、それがクリアされていないキャッシュに残ることがあります。

おすすめ

転載: www.cnblogs.com/liuys635/p/12594313.html