Tomcat
當多個上傳並行發生(堆空間)時,JVM/Tomcat 崩潰?
我有一個在 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 參數來防止這個問題。但說真的,我的情況有什麼問題嗎?
- 是否有像我的場景一樣處理文件上傳的最佳實踐?
- 我可以如何防止這個問題嗎?我的意思是當 5GB 不足以進行 3-5 次並行上傳時,我需要多少資源來進行數百次並行上傳?
- 我的應用程序如此糟糕還是文件上傳佔用如此多資源是否正常?
以下是在 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 堆空間的數量。