2

我正在使用servlet来执行多个文件上传(使用Apache Commons FileUpload)。我的代码的一部分张贴在下面。我的问题是,如果我一次又一次地上传文件,应用程序服务器的内存消耗会大幅跳跃。 Apache Tomcat服务器似乎挂在内存上,永远不会返回它。堆空间耗尽内存。有时它会耗尽内存异常并抛出java heap space errorServlet文件上传

我关闭了所有的输入流,我认为问题出在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()) { 
     ... 
+0

用VisualVM连接到JVM,看看有什么记忆,我敢打赌它不会是comons上传的东西。 –

回答

0

您使用FileCleaningTracker,有与该组件中的一个错误的Apache的Commons FileUpload版本(看到这一点:http://blog.novoj.net/2012/09/19/commons-file-upload-contains-a-severe-memory-leak/

现在看来,这已经确定了:https://issues.apache.org/jira/browse/FILEUPLOAD-189

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

+0

谢谢... u能描述了使用DiskFileItemFactory的,当我创建一个没有它ServletFile上传对象 – striker

+0

@ user2535809这东西是更好的[Apache的百科全书文件上传文件]中解释了haapens(HTTP://commons.apache .org/proper/commons-fileupload /)查看用户指南,流API和javadoc。 – morgano