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

Java 使用不同的类加载器加载类,以便在不需要时从JVM中卸载它们,java,jvm,classloader,serviceloader,Java,Jvm,Classloader,Serviceloader,在我的应用程序中,我使用ServiceLoader用不同的类加载器加载模块(来自.jar文件的类),以便在不需要时从应用程序上下文和JVM本身完全卸载它们。我知道“从JVM卸载类”可能不是一个常见的主题,这是有条件的,所以我正在做出必要的努力。为了确保一切正常运行,我使用-XX:+TraceClassLoading和-XX:+TraceClassLoading跟踪类的加载和卸载,来自此参数的信息显示我可以从mi应用程序和JVM本身完全卸载任何模块(在完整GC期间从JVM卸载)。这一切似乎都很好。

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

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

一些谷歌搜索显示Tomcat6.x有一个选项antiJARLocking,该选项在Tomcat源代码中使用

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

关于“防Jarlocking”的信息显示:如果为true,当通过URL访问JAR内部的资源时,Tomcat类加载器将采取额外措施避免JAR文件锁定。这将影响应用程序的启动时间,但在可能发生文件锁定的平台或配置上可能会被证明是有用的。”。因此,您建议对tomcat?执行相同的操作。而JVM不够聪明,无法释放文件?