2015-11-15 2 views
3

У меня возникли проблемы с большими загрузками файлов на мой сервер причала Trace.Ошибка памяти при больших загрузках файлов

Я загрузив как многоэлементная/форм-данных, а также извлечения файла из запроса с использованием scalatra в FileUploadSupport (как показано ниже)

class foo extends ScalatraServlet with FileUploadSupport { 
    configureMultipartHandling(MultipartConfig(maxFileSize = Some(1073741824))) 
    post("/upload") { 
    //{1} 
    ... //(VALIDATION AND USER LOGIN WITH SCENTRY) 
    ... //(Transactionally posts meta info to Elasticsearch and writes video to filesystem) 
    } 
} 

У меня есть батареи тестов и не имеют никакой проблемы работает это с меньшим файлы ~ 50 МБ и даже 3-400 МБ файлов при запуске сервера на localhost.

Тем не менее, когда я размещаю свой сервер на удаленной машине, у меня есть некоторые транспортные проблемы. И, (при отладке), я никогда не достигаю точки останова в {1}

Исследование проблемы, которую я нашел this Что предполагает повторное использование одного и того же http-соединения, может вызвать проблему. После их советов я добавил ниже мой сервлет и на анализ заголовков ответа, я могу подтвердить его «взял»:

before("/*") { 
    response.addHeader("Connection", "close") 
} 

Моих исследования также показали некоторые проблемы с наличием слишком много ключей формы, однако данная форма имеет только 4 ключа, и я не вижу проблемы на локальном хосте или с меньшими файлами на удаленном компьютере.

Эта загрузка происходит через https (в случае, если это имеет значение) с сертификатом CA, подписанным и принятым Google Chrome как безопасное частное соединение.

При настройке соединителя сервера, я изменил значение для времени ожидания в случае, который вызывает какие-либо проблемы

httpsConnector.setIdleTimeout(300000) 

Несмотря на эти модификации, я до сих пор решить эту проблему, и я признателен за любые советы вы могли бы иметь ,

EDIT1-SOLVED-

Я полагал, я был уже назначен 4G кучного пространства и, следовательно, это была ошибка nonesene. Оказывается, версия, которую я запускал на localhost, была через intellij, у которой есть свои идеи о размере кучи.

при запуске его на удаленном компьютере с «sbt run» Я забыл включить опцию fork в мою build.scala. следовательно, sbt проигнорировал мои параметры jvm (возможно, невозможно установить параметры на запущенном jvm), и я работал с кучей в 300 Мб.

+1

Ваш ['MultipartConfig'] (http://docs.oracle.com/javaee/7/api/javax/servlet/annotation/MultipartConfig.html) должен указывать' location', чтобы файлы записывались/читались из этого места на вашем локальном диске (таким образом, не требуя хранения памяти для хранения всего содержимого файла). –

+0

Спасибо, я сделал это изменение, а также установил размер кучи – Richard

ответ

1

В вашей трассе отображается исключение из памяти. Очевидно, что при загрузке файлов у вас заканчивается память.

Вы пытались увеличить размер кучи. Разница между вашим удаленным и локальным сервером?

+0

Привет, спасибо за ваш ответ. Я полагал, что уже назначил 4G кучного пространства, и поэтому это была ошибка nonesene. Оказывается, версия, которую я запускал на localhost, была через intellij, у которой есть свои идеи о размере кучи. При запуске на удаленном компьютере с «sbt run» я забыл включить опцию fork в мою build.scala. Следовательно, sbt проигнорировал мои параметры jvm, и я работал с кучей 300 мб. – Richard

+0

Замечательно, что ваша проблема решена! Примите мой ответ. –

Смежные вопросы