Java Servlet文件上传

Java Servlet文件上传,java,web-applications,servlets,heap-memory,apache-commons-fileupload,Java,Web Applications,Servlets,Heap Memory,Apache Commons Fileupload,我正在使用servlet进行多文件上传(使用ApacheCommonsFileUpload)。我的部分代码发布在下面。我的问题是,如果我一次又一次地上传文件,应用服务器的内存消耗会急剧增加。ApacheTomcat服务器似乎一直保留着内存,并且从不返回内存。堆空间的内存不足。有时它会出现内存不足异常并抛出java堆空间错误 我关闭了所有的输入流,我想问题出在ServletFileUpload,有人能帮我关闭它吗 ServletContext context=this.getServletConf

我正在使用servlet进行多文件上传(使用ApacheCommonsFileUpload)。我的部分代码发布在下面。我的问题是,如果我一次又一次地上传文件,应用服务器的内存消耗会急剧增加。ApacheTomcat服务器似乎一直保留着内存,并且从不返回内存。堆空间的内存不足。有时它会出现内存不足异常并抛出
java堆空间错误

我关闭了所有的输入流,我想问题出在
ServletFileUpload
,有人能帮我关闭它吗

ServletContext context=this.getServletConfig().getServletContext();
DiskFileItemFactory factory = new DiskFileItemFactory();
FileCleaningTracker fileCleaningTracker = FileCleanerCleanup.getFileCleaningTracker(context);
factory.setFileCleaningTracker(fileCleaningTracker);

if (isMultiPart) {
    upload = new ServletFileUpload(factory);

    try {
        itr = upload.getItemIterator(request);
        while (itr.hasNext()) {

        item = itr.next();
        if (item.isFormField()) {
        ...

您使用的是FileCleaningTracker,有些版本的Apache commons FileUpload在该组件中有一个bug(请参见此:)

似乎已经修好了:


因此,请尝试使用最新的可用版本。

使用VisualVM连接到JVM,看看占用内存的是什么,我打赌这不会是comons上传的内容。谢谢……您能描述一下DiskFileItemFactory的用法吗,当我创建一个ServletFile上载对象时,没有it@user2535809这在《用户指南》、《流式API》和javadoc中有更好的解释。