Как избежать файла загрузки OutofMemoryError?

StackOverflow https://stackoverflow.com/questions/3966421

  •  09-10-2019
  •  | 
  •  

Вопрос

Я пытаюсь загрузить файлы изображений. При загрузке файлов размеров около 40 до 200 КБ все в порядке. Но когда я пытаюсь загрузить файл размера 459КБ, иногда его загрузки, а иногда outofmemoryError показан. Я не думаю, что размер файла очень большой для этой ошибки, чтобы быть брошенным. Я использую смолу. Возможно ли, есть настройка смолы, которая предотвращает загрузку файлов большого размера? Потому что в коде нет нигде, я не устанавливаю максимальный размер для загрузки файла.

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

Это было полезно?

Решение

Если у вас заканчивается память, первое, что проверить, сколько памяти выделил ваш JVM. Вы не говорите, как смола работает или какая JVM она использует или OS / Host, но, как правило, JVM будет регулироваться размером кучи по умолчанию и максимальный размер кучи AA. Из командной строки стандарт JVM имеет -Xms и -Xmx Параметры, которые управляют этими значениями. Когда JVM запускается, он выделяет кучу по умолчанию, и она позволит ему расти максимум. Когда распределение превышает максимальную кучу, он может попытаться выпустить любые мягкие / слабые ссылки и другие одноразовые ресурсы, заставляют GC, но если он еще не хватает места, он будет бросить OutOfMemoryException. Отказ Следовательно, изменение значений может влиять, когда это произойдет.

Второе, что искать, это то, как вы распределите память на сервере. Например, если ваш сервер содержит кучу вещей в памяти с прочными ссылками, вы можете заканчиваться памятью, если так, чтобы рассмотреть возможность использования слабых ссылок или что-то вроде Ehcache. переместить вещи на диск. Или, если ваш сервлет был выделен MB вместо Kb из-за некоторой ошибки расчета. Вы не должны пытаться прочитать весь ввод в память в любом случае. Предполагая, что вы реализуете сервлет, затем прилагаемый ServletRequest / HttpServletRequest Позволяет получить доступ к входному потоку PostData, и вы можете прочитать его в кусках (например, 32 КБ одновременно) и записывать его на выходной буфер в кусках. Как правило, чтение данных для чтения большого пальца в дискретных кусочках все равно будет лучше практиковать, поскольку вы не хотите, чтобы ненадежные данные могли сломать свой сервер, передавая вам немного массивного файла.

Другие советы

OutofmemoryError. брошены JVM, когда недостаточно памяти доступно для конкретного действия (например, мнение объекта)

Чтобы избежать таких ошибок, вы можете увеличить память доступен для JVM при запуске времени, используя определенную опцию в зависимости от вашего JVM (обычно -XMX512M для 512 Megas)

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

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

Использование XMX XMS XSS

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top