在我的应用程序中,我使用ServiceLoader加载具有不同ClassLoaders的模块(来自.jar文件的类),以便在不需要时从应用程序上下文和ClassLoaders本身完全卸载它们。我知道“从JVM卸载类”可能不是一个常见的话题,但有一些条件会发生这种情况,所以我做出了必要的努力。为了确保一切都像预期的那样工作,我使用-XX:+TraceClassLoading和-XX:+TraceClassUnloading跟踪类的加载和卸载,来自此参数的信息显示我可以从mi app和JVM本身完全卸载任何模块(从JVM卸载发生在完整的GC期间)。所有这些看起来都很好..。但是我的问题是,为什么.jars不能删除加载模块类的.jar文件,但是JVM说已经从其中卸载了类。显然,这是在JVM执行期间进行的,但是如果JVM没有从.jar文件加载类,为什么要保持打开这些文件呢?有什么办法可以强制JVM释放这些.jar文件呢?
发布于 2011-09-09 04:20:19
类加载/卸载的问题应该在不同的web容器中深入研究。
一些谷歌搜索显示,Tomcat6.x有选项antiJARLocking,该选项在http://svn.apache.org/repos/asf/tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/的Tomcat源代码中使用
请阅读源代码,您将在那里获得加载/卸载代码的示例。
https://stackoverflow.com/questions/7352739
复制相似问题