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