tomcat中web应用反部署时jar包不能删除的问题

一个web应用部署到tomcat之后,WEB-INF中的lib目录下的jar文件,如果被使用到,是不能被删除的。这个是因为classloader打开了这些文件,这些文件被锁定了。这个现象在windows下存在,在linux下就不存在了。

其实这个问题在windows的JDK中似乎就有问题。就是使用URLClassLoader读取一个jar文件中的class,那么,这个jar文件会被锁定,这个进程结束前,是不能被删除的。特别是使用getResourceAsStream方法,一旦使用,即使使用System.gc()也没有用。另外,使用System.gc()太占资源了。

但是,如果是用.war文件部署的,删除.war包,那么对应的文件夹就会被删除。这个是怎么做到的?因为classloader本身没有提供stop或者remove class的方法。
tomcat的源代码中WebAppClassLoader中有stop方法,似乎可以释放jar文件。但是还没有仔细研究。

如果在context.xml中置顶anti-locking为true,那么lib/*.jar是可以被删除的。因为tomcat将这些文件的副本拷贝到了临时文件目录。这样只是锁定了副本。原有文件是可以被删除的。

以上是粗浅见解,那面有错。欢迎交流。

你可能感兴趣的:(jdk,tomcat,Web,linux,windows)