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