Java Classloader不会在Windows下发布文件句柄

时间:2011-09-10 11:04:32

标签: java classloader

应用程序需要从运行时提供的jar加载类。在运行期间,这些jar应该被删除并被其他jar替换,这会失败,因为看起来,ClassLoader不会释放在jar上获取的文件句柄。

这是一个已知问题吗?是否有可用的类加载器没有这个问题?

编辑:用例不是关于加载同一个类的不同版本,而是加载同一个接口的不同实现。这些类使用应用程序必须调用的“execute”方法实现一个接口。因此,虽然类的卸载机制在这种情况下也很有用,但这不是主要的用例。

2 个答案:

答案 0 :(得分:3)

看看这个What is the reason that setDefaultUseCaches(false) of URLConnection is eagerly called in the org.apache.catalina.core.JreMemoryLeakPreventionListener

它可以回答你的问题。使用UrlConnection并将cache设置为true时,它不会关闭文件处理程序。

此外,它还提供了将缓存设置为false的解决方法。

URL url = new URL("jar:file://dummy.jar!/");  
URLConnection uConn = new URLConnection(url) {  
    @Override
    public void connect() throws IOException {          
      // NOOP     
    }  
};
uConn.setDefaultUseCaches(false); 

在使用URLConnection之前,只需要在静态块中调用它。

这取决于您的类加载器的实现方式。

答案 1 :(得分:1)

在卸载类加载器之前,ClassLoader不会释放jar。如果不创建新的类加载器,则无法加载新版本的类,因此我看不出您希望如何工作。

也许您想要的是一个OSGi容器,例如Apache Karaf,它允许您在运行时加载/卸载库。