【问题标题】:loading classes with different classloaders to unload them from the JVM when not needed使用不同的类加载器加载类,以便在不需要时从 JVM 中卸载它们
【发布时间】: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


    【解决方案1】:

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

    一些谷歌搜索显示 Tomcat 6.x 有选项 antiJARLocking 该选项在 Tomcat 源代码中使用http://svn.apache.org/repos/asf/tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/

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

    【讨论】:

    • 关于“antiJARLocking”的信息说:“如果为真,当通过 URL 访问 JAR 中的资源时,Tomcat 类加载器将采取额外措施来避免 JAR 文件锁定。这会影响应用程序的启动时间,但是可能证明在可能发生文件锁定的平台或配置上很有用。”。所以你建议做同样的tomcat?。而且JVM还不够聪明,无法释放文件?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多