加载具有不同类加载器的类,以便在不需要时从JVM中卸载它们

时间:2011-09-08 18:26:17

标签: java jvm classloader serviceloader

在我的应用程序中,我使用ServiceLoader加载具有不同ClassLoader的模块(来自.jar文件的类),以便在不需要时从应用程序的上下文和JVM本身完全卸载它们。我知道也许不是一个常见的主题“从JVM卸载类”,有一些条件可以实现,所以我正在做出必要的努力。为了确保一切都像预期的那样工作,我正在跟踪-XX:+ TraceClassLoading和-XX:+ TraceClassUnloading的类的加载和卸载,这些参数的信息告诉我,我可以从中完成任何模块的卸载mi app和JVM本身(在完整的GC期间从JVM卸载)。所有这一切似乎都运行良好...但我的问题是为什么加载模块类的.jar文件是由JVM保持打开的?,.jars不能被删除但是JVM说要从它们卸载类。显然这是在JVM执行期间,但是如果JVM没有从它们加载类,为什么要保持打开.jar文件?有什么办法可以强迫JVM释放那些.jar文件?

1 个答案:

答案 0 :(得分:0)

应该在不同的Web容器中深入探索类加载/卸载的问题。

一些谷歌搜索显示Tomcat 6.x具有选项antiJARLocking,该选项用于http://svn.apache.org/repos/asf/tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/的Tomcat源

请阅读来源,您将获得加载/卸载代码示例。