首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何“关闭”ClassLoader?

如何“关闭”ClassLoader?
EN

Stack Overflow用户
提问于 2011-09-20 23:45:25
回答 6查看 9K关注 0票数 11

我有一个案例,我需要在我的应用程序中创建大量的类加载器,以便在用户提供的脚本运行时临时使一些代码可见。为此,我使用了一个URLClassLoader,它工作得很好。

当脚本终止时,我想“卸载”或“关闭”类加载器以释放资源。

将对类加载器的引用设置为null是否足够?我特别想知道我是否最终会用完文件句柄,因为额外的类在JAR文件中。

PS:必须与Java 5及更高版本一起使用。是的我知道..。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-09-21 00:00:51

当类加载器加载的所有类不再具有任何引用,并且对类加载器本身的所有引用都已被擦除时,类加载器及其加载的类将被作为一个组进行垃圾回收。

请注意,这取决于是否设置了JVM属性,该属性会导致卸载未引用的类。它在大多数环境中是默认设置的,但在某些嵌入式情况下可能不是。

请注意,删除对类的引用不是一件微不足道的事情。当然,任何其他通过名称引用它的类都将阻止删除。因此,必须使用ClassLoader.findClass或类似的方法加载该类。

票数 4
EN

Stack Overflow用户

发布于 2014-06-28 14:30:30

有点晚了,但希望这能对后来来讨论这个问题的人(比如我)有所帮助。

在Java7中,向URLClassLoader添加了一个close()方法,这正是OP所要求的。

编辑(感谢@ Licks) OK,所以它并不完全是OP所要求的。它不会释放所有资源,也不会使资源和加载器成为可收集的。它只是防止使用类加载器加载更多的资源。但是,它会关闭与URLClassLoader一起加载的jar文件。

票数 8
EN

Stack Overflow用户

发布于 2015-06-29 19:38:44

如果您不能使用Java7并且它是close()方法,那么可以使用反射来关闭类加载器的所有打开的JAR归档文件,如下所示:

代码语言:javascript
复制
public void close() {
try {
   Class clazz = java.net.URLClassLoader.class;
   java.lang.reflect.Field ucp = clazz.getDeclaredField("ucp");
   ucp.setAccessible(true);
   Object sun_misc_URLClassPath = ucp.get(this);
   java.lang.reflect.Field loaders = 
      sun_misc_URLClassPath.getClass().getDeclaredField("loaders");
   loaders.setAccessible(true);
   Object java_util_Collection = loaders.get(sun_misc_URLClassPath);
   for (Object sun_misc_URLClassPath_JarLoader :
        ((java.util.Collection) java_util_Collection).toArray()) {
      try {
         java.lang.reflect.Field loader = 
            sun_misc_URLClassPath_JarLoader.getClass().getDeclaredField("jar");
         loader.setAccessible(true);
         Object java_util_jar_JarFile = 
            loader.get(sun_misc_URLClassPath_JarLoader);
         ((java.util.jar.JarFile) java_util_jar_JarFile).close();
      } catch (Throwable t) {
         // if we got this far, this is probably not a JAR loader so skip it
      }
   }
} catch (Throwable t) {
   // probably not a SUN VM
}
return;
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7487952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档