自分自身のスレッドを作成することによるメモリリークに関するTomcatの警告を解決しようとしています。 http://wiki.apache.org/tomcat/MemoryLeakProtectionは、スレッドを開始する前にmyThread.setContextClassLoader(null)
に電話することを提案しています。setContextClassLoaderの意味
この呼び出しの意味は何ですか。 run()メソッドのコードは、アプリケーションからクラスを解決できますか?
自分自身のスレッドを作成することによるメモリリークに関するTomcatの警告を解決しようとしています。 http://wiki.apache.org/tomcat/MemoryLeakProtectionは、スレッドを開始する前にmyThread.setContextClassLoader(null)
に電話することを提案しています。setContextClassLoaderの意味
この呼び出しの意味は何ですか。 run()メソッドのコードは、アプリケーションからクラスを解決できますか?
はい、そうです。 Thread.getContextClassLoader()
は、汎用フレームワークのためのメカニズムであり、クラスローダーツリーからさらにリソースをロードします。
Tomcatのクラスローダー階層を取ります。
Bootstrap
|
System
|
Common
/ \
Webapp1 Webapp2 ...
サーブレットまたはJSPフレームワークはCommon
クラスローダに存在します。これらのフレームワークの1つがWebapp1
からクラスパスリソースをロードすることであるならば、彼らは試みることができる:クラスローディングメカニックのみデリゲートがクラスローダのチェーンを呼び出すので、
getClass().getResource("/some/resource/in/webapp1"); // fail
しかし、これは失敗します。これは、リソースをロードするために必要なすべてのフレームワークが代わりに行うことを意味します
Thread.currentThread().getContextClassLoader().getResource("/some/resource/in/webapp1");
とサーブレットコンテナがこのスレッドがそのコンテキストで実行されるたびにWebapp1
クラスローダであることを確認します。したがって、スレッドのコンテキストクラスローダーは、事実上、フレームワークがクラスを「間違った方向」からロードする方法です。
新しいスレッドを生成すると、そのスレッドはデフォルトで親のコンテキストクラスローダー(Webapp1
クラスローダー)を取得します。その結果、Webapp1
を停止した場合、tomcatはwebappにGCできるようになっていますが、Webapp1
クラスローダーに残っている参照がある限り、これを行うことはできません。
Thread.currentThread()。getContextClassLoader()を実行する前に、それらを設定する必要があります。私はコードにアクセスすることができないので、Tomcat Configurationを使ってそれらを設定するにはどうすればいいですか? – yapkm01