私のアプリケーションでは、ServiceLoader を使用してモジュール (.jar ファイルからのクラス) を異なる ClassLoader でロードし、アプリケーションのコンテキストおよび JVM 自体から不要なときに完全にアンロードします。「JVMからクラスをアンロードする」というのは一般的なトピックではないかもしれませんが、それにはいくつかの条件があるので、必要な努力をしています。すべてが期待どおりに機能しているかどうかを確認するために、-XX:+TraceClassLoading と -XX:+TraceClassUnloading を使用してクラスのロードとアンロードをトレースしています。このパラメーターからの情報は、任意のモジュールを完全にアンロードできることを示しています。 mi アプリおよび JVM 自体から (JVM からのアンロードは完全な GC 中に発生します)。これはすべてうまくいくようです...しかし、私の質問は、モジュールクラスがロードされた場所からの.jarファイルがJVMによって開かれたままになっているのはなぜですか? jar は削除できませんが、JVM はそれらからクラスをアンロードしたと言います。明らかにこれは JVM の実行中ですが、JVM にクラスがロードされていないのに、なぜその .jar ファイルを開いたままにしておくのでしょうか? JVM に強制的にその .jar ファイルを解放させるためにできることはありますか?
1267 次
1 に答える
0
クラスのロード/アンロードの問題は、さまざまなWebコンテナ内で深く調査する必要があります。
一部のグーグルでは、Tomcat 6.xにオプションantiJARLockingがあり、そのオプションはhttp://svn.apache.org/repos/asf/tomcat/tc6.0.x/trunk/java/org/apache/のTomcatソースで使用されていることが示されています。カタリナ/ローダー/
ソースを読んでください。そこにロード/アンロードコードのサンプルがあります。
于 2011-09-08T20:20:18.530 に答える