Tomcat

當多個上傳並行發生(堆空間)時,JVM/Tomcat 崩潰?

  • September 3, 2013

我有一個在 Tomcat 7 上執行的 Servlet 應用程序。我在 setenv.sh 中設置了以下內容

CATALINA_OPTS="
-server 
-Xms1G 
-Xmx5G
-XX:MaxPermSize=512m
-Dfile.encoding=UTF-8";

該伺服器在 Ubuntu 12.04LTS 上執行,具有 6 個核心和 8GB 記憶體。我的應用程序是一個 Grails/Spring/Java 應用程序,使用者可以在其中上傳圖像。有時會出現 3-5 個使用者同時開始上傳圖像。在這些情況下,我的 Tomcat 由於以下錯誤而崩潰:

java.lang.OutOfMemoryError: Java heap space

我知道我必須增加我的 Tomcat 的 Xmx 參數來防止這個問題。但說真的,我的情況有什麼問題嗎?

  1. 是否有像我的場景一樣處理文件上傳的最佳實踐?
  2. 我可以如何防止這個問題嗎?我的意思是當 5GB 不足以進行 3-5 次並行上傳時,我需要多少資源來進行數百次並行上傳?
  3. 我的應用程序如此糟糕還是文件上傳佔用如此多資源是否正常?

以下是在 Grails 控制器中處理上傳的程式碼:

CommonsMultipartFile file = (CommonsMultipartFile) request.getFile('image')
file.transferTo(new File("${storagePath}${fullFileName}"))

上傳後我做了很多圖像處理。有沒有辦法讓這個過程排隊?

說實話,5G的堆已經不少了。向我們展示處理上傳的程式碼路徑,並提供有關使用者通常上傳的文件大小和數量的一些資訊。

這也可能對您有所幫助(如果您將公共文件上傳與 Spring 的 MultipartFile 一起使用):https ://stackoverflow.com/questions/1693810/how-can-i-avoid-outofmemoryerrors-when-using-commons-fileuploads-diskfileitem-t

記憶體使用取決於應用程序的設計目的以及所有使用者在做什麼。所以真的沒有人可以評論這個應用程序是否需要指定數量的記憶體。正如您所說,您的解決方案是按照錯誤消息的說明增加 Java 堆空間的數量。

引用自:https://serverfault.com/questions/533681