Apache Tomcat 10.1无法删除临时文件问题求助
Tomcat 10.1 + Java 11临时文件堆积无法删除问题分析
我们已将Tomcat从9.0版本升级至10.1版本,同时将Java从8版本升级至11版本,除以下问题外其余运行正常:临时文件在Apache Software Foundation\Tomcat 10.1\work\Catalina\localhost\root目录大量堆积,引发Java堆内存问题后出现502错误,报错信息如下:
07-Feb-2023 23:33:11.414 SEVERE [http-nio-81-exec-3] org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun Error running socket processor java.io.UncheckedIOException: Cannot delete C:\Program Files\Apache Software Foundation\Tomcat 10.1\work\Catalina\localhost\root\upload_ac88107d_733f_4b9d_a3a3_9274a46f92e3_00000509.tmp at org.apache.tomcat.util.http.fileupload.disk.DiskFileItem.delete(DiskFileItem.java:429) at org.apache.catalina.core.ApplicationPart.delete(ApplicationPart.java:54) at org.apache.catalina.connector.Request.recycle(Request.java:451) at org.apache.catalina.connector.CoyoteAdapter.log(CoyoteAdapter.java:512) at org.apache.catalina.connector.CoyoteAdapter.checkRecycled(CoyoteAdapter.java:536) at org.apache.coyote.http11.Http11Processor.recycle(Http11Processor.java:1440) at org.apache.coyote.AbstractProtocol$ConnectionHandler.release(AbstractProtocol.java:1052) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:1024) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1734) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:834) Caused by: java.io.IOException: Cannot delete C:\Program Files\Apache Software Foundation\Tomcat 10.1\work\Catalina\localhost\root\upload_ac88107d_733f_4b9d_a3a3_9274a46f92e3_00000509.tmp ... 14 more
可能的原因:
- 文件句柄未释放:Java 11的资源管理机制比Java 8更严格,若业务代码处理上传文件时,未正确关闭
InputStream/OutputStream,或是未确保DiskFileItem相关资源完全释放,会导致临时文件被Tomcat进程占用,无法触发删除逻辑。Tomcat 10.1的ApplicationPart回收流程依赖资源的正确释放,一旦存在泄漏就会出现删除失败。 - 权限不足:Tomcat运行进程没有删除
C:\Program Files目录下文件的权限。Java 11强化了文件系统权限检查,而Tomcat 9.0在Java 8环境下可能因宽松的权限策略绕过了这个限制,升级后权限不足直接导致临时文件无法删除。 - Tomcat配置或逻辑变更:Tomcat 10.1对临时文件的清理策略、
Request回收逻辑做了调整,比如fileCleanerDelay(临时文件清理延迟)、maxFileSize等参数的默认值与9.0不同,若未针对性调整配置,会导致文件堆积无法及时清理;另外,自定义Servlet或过滤器若干扰了Request的正常回收流程,也会阻止临时文件的删除。 - 第三方库兼容性问题:项目依赖的文件上传相关第三方库(如旧版本commons-fileupload)未适配Jakarta EE规范。Tomcat 10.x基于Jakarta EE 9,API包名从
javax.servlet改为jakarta.servlet,未适配的库会导致文件处理逻辑异常,无法正确触发临时文件的删除操作。
内容的提问来源于stack exchange,提问作者Zachary McArthur
相关产品推荐
相关产品推荐

