0

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

4

1 回答 1

0

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

一些谷歌搜索显示 Tomcat 6.x 有选项 antiJARLocking 该选项用于 Tomcat 源中的http://svn.apache.org/repos/asf/tomcat/tc6.0.x/trunk/java/org/apache/卡特琳娜/装载机/

请阅读源代码,您将在那里获得加载/卸载代码的示例。

于 2011-09-08T20:20:18.530 回答