Вспышка памяти Android - PullRequest
0 голосов
/ 28 марта 2012

Для начала, спасибо, что нашли время, чтобы просмотреть мой вопрос. В настоящее время у меня возникают проблемы с скачком памяти в разрабатываемом приложении.

Мое намерение состоит в том, чтобы иметь возможность загружать и обрабатывать большие объемы данных HTML, в настоящее время причина заключается в больших кодированных в base64 изображениях, вложенных в HTML, которые, как я понимаю, не идеальны для использования на мобильной платформе. Для справки, в настоящее время я тестирую на Samsung Galaxy S. Кроме того, эта проблема , а не возникает на Galaxy Nexus из-за большего выделения памяти под приложение.

Моя проблема заключается в том, что при обработке большого фрагмента данных HTML размером приблизительно 2,8 МБ, куча памяти увеличивается примерно до 27-29 МБ, но выделенная память никогда не выходит за пределы 18-19 МБ. Когда HTML был обработан, сохранен и отображен, выделенная память возвращается к 3-4 МБ. Если бы я должен был затем загрузить и обработать этот HTML снова, процесс повторяется, и я получаю то же самое использование памяти, за исключением того, что кажется для дальнейшего увеличения кучи (что мне не кажется необходимым), при этом Я получаю ошибку Out of memory.

Когда я получаю эту ошибку, это обычно происходит при загрузке HTML с использованием HttpGet или при извлечении данных с диска с помощью StringBuffer. Иногда это вызвано Bitmap во время инфляции XML.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 05 апреля 2012

Лучшая практика - не выделять много памяти. Обработайте данные в потоке, когда вы читаете их из сети, или передайте их на диск, а затем прочитайте оттуда. Опция android: largeHeap доступна на всех устройствах под управлением Android 3.0 или выше, но это только увеличивает сумму, которую вы можете выделить, но не снимает ограничение в целом.

0 голосов
/ 29 марта 2012

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

Удаление памяти не происходит мгновенно.Для освобождения всей памяти может потребоваться несколько итераций (и каждая итерация может выполняться с интервалом в несколько секунд).

Часто возникают проблемы со слишком большим объемом памяти, используемой изображениями / рисованными объектами.Иногда это утечка памяти;В других случаях невозможно сказать, что является причиной этого.

У меня также были проблемы с анализом больших XML-файлов.Моим решением было разделить эти файлы на более мелкие.Другая возможность - рассмотреть преимущества и недостатки различных парсеров xml (первый результат Google: SAX-парсер против XML-парсера ).Может быть, использовать какую-то стороннюю реализацию, специально разработанную с точки зрения использования памяти?Третий вариант - использование сервера для преобразования XML-файла в более эффективный формат.

...