Назад | Перейти на главную страницу

JVM / Tomcat дает сбой, когда несколько загрузок происходят параллельно (пространство кучи)?

У меня есть приложение Servlet, работающее на Tomcat 7. Я установил следующее в setenv.sh

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

Сервер работает на Ubuntu 12.04LTS, имеет 6 ядер и 8 ГБ оперативной памяти. Мое приложение - это приложение Grails / Spring / Java, в которое пользователи могут загружать изображения. Иногда бывает, что 3-5 пользователей одновременно загружают изображения. В этих ситуациях мой Tomcat дает сбой из-за следующей ошибки:

java.lang.OutOfMemoryError: Java heap space

Я знаю, что мне нужно увеличить параметр Xmx моего Tomcat, чтобы предотвратить эту проблему. А серьезно, что не так в моем случае?

  1. Есть ли лучший способ обработки загрузки файлов, как в моем сценарии?

  2. Могу ли я как-нибудь предотвратить эту проблему? Я имею в виду, когда 5 ГБ недостаточно для 3-5 параллельных загрузок, сколько ресурсов мне нужно для сотен параллельных загрузок?

  3. Мое приложение настолько плохое, или это нормально, что загрузка файла требует так много ресурсов?

Вот код, который обрабатывает загрузку в контроллере Grails:

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

После загрузки я много занимаюсь обработкой изображений. Есть ли способ поставить процесс в очередь?

Использование памяти зависит от того, для чего было разработано приложение, и от того, что делают все пользователи. Так что действительно никто не может прокомментировать, нужно ли этому приложению определенный объем памяти. Как вы сказали, ваше решение состоит в том, чтобы сделать то, что говорится в сообщении об ошибке, и увеличить объем кучи Java.

Если честно, 5G кучи уже довольно много. Покажите нам путь к коду, который обрабатывает загрузку, и предоставьте некоторую информацию о размерах и количестве файлов, которые обычно загружают пользователи.

Это также может вам помочь (если вы используете загрузку файлов общего пользования с MultipartFile Spring): https://stackoverflow.com/questions/1693810/how-can-i-avoid-outofmemoryerrors-when-using-commons-fileuploads-diskfileitem-t