У меня есть приложение 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, чтобы предотвратить эту проблему. А серьезно, что не так в моем случае?
Есть ли лучший способ обработки загрузки файлов, как в моем сценарии?
Могу ли я как-нибудь предотвратить эту проблему? Я имею в виду, когда 5 ГБ недостаточно для 3-5 параллельных загрузок, сколько ресурсов мне нужно для сотен параллельных загрузок?
Мое приложение настолько плохое, или это нормально, что загрузка файла требует так много ресурсов?
Вот код, который обрабатывает загрузку в контроллере 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