2013-10-26 10 views
0

У меня есть приложение «Живые обои», в котором используются фотографии, загруженные из Интернета, для использования в качестве обоев.Использование памяти приложения для приложений Android слишком велико (как сообщают менеджеры памяти)

Менеджеры памяти показывают, что мое приложение использует от 90 МБ до 120 МБ (это устройство с 1 ГБ ОЗУ). Это много. Служба обои get часто убивается, а иногда система даже возвращается к статическим обоям по умолчанию.

Хотя я тщательно проверил все утечки памяти и анализ дампа HPROF показал, что у меня есть только 2 больших объекта: в настоящее время используется растровое изображение для обоев (16 МБ - и это ожидается для изображения 4Mpix) и класса android.content. res.Resource (12 МБ) с общим объемом 32 МБ, как описано в обзоре HPROF.

dumpsys MemInfo показывает это:

** MEMINFO in pid 1354 [com.myapp.lwp] ** 
        Shared Private  Heap  Heap  Heap 
       Pss Dirty Dirty  Size Alloc  Free 
      ------ ------ ------ ------ ------ ------ 
    Native  16  16  16 112304  5274  993 
    Dalvik 41947 19316 41428 74572 53120 21452 
    Cursor  0  0  0 
    Ashmem  0  0  0 
Other dev 20170 33176  3460 
.so mmap  5690  2620  1504 
.jar mmap  0  0  0 
.apk mmap  64  0  0 
.ttf mmap  6  0  0 
.dex mmap  604  0  4 
Other mmap  1035  300  272 
    Unknown  5127  472  5116 
    TOTAL 74659 55900 51800 186876 58394 22445 

Objects 
      Views:  27   ViewRootImpl:  0 
    AppContexts:  4   Activities:  1 
      Assets:  3  AssetManagers:  3 
    Local Binders:  16  Proxy Binders:  23 
Death Recipients:  0 
OpenSSL Sockets:  1 

Я прочитал это: How do I discover memory usage of my application in Android?, но это не поможет мне сделать вывод, что угодно ...

Я также использовал:

cat /proc/1354/statm 
    139422 29326 11550 2 0 10330 0 

It тоже не помогает.

DDMS показывает размер кучи 63 МБ.

Мои вопросы есть? Является ли это нормальным и ожидаемым от приложения, которое имеет дело с изображениями двойного размера экрана? Если нет, то что осталось в 60-90 МБ? (i subctract 30MB, что HPROF дал мне для общего). Что я могу сделать неправильно в своем приложении, чтобы использовать столько памяти? Что приложение actualy сделать:

1) Download list of photos (max 100) as JSON string and parse that string to get ids and urls for these photos. 
2) Download first photo and save it to cache folder 
3) Decode photo and if necessary resize it to fit 2Width*Height of screen (photos are actualy smaller that my Full HD screen). 
4) Draw it on wallpaper canvas (and draw repeatedly while user is scrolling) 
5) If on WIFI download next 10 photos to cache folder (without decoding, just saving) 

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

Это не проблема непрерывного использования - память описана после первого запуска: Если я убью службу, после перезагрузки она использует 90 МБ. После первого открытия экрана параметров (небольшая активность/диалог с несколькими вариантами выбора - без графики, кроме фоновых рисунков), использование памяти переходит на 124 МБ и возвращается к 112 МБ после закрытия экрана. После первой смены обоев фото он перескакивает до 130+ и возвращается к 120+. Вероятно, потому что размер кучи увеличивается при декодировании растрового изображения, а затем остается таким.

Что мне делать? Как уменьшить (если вообще возможно) объем памяти моего приложения? Где еще смотреть? Я не ожидаю готового решения, но любые дальнейшие рекомендации могут помочь ...

ответ

0

У меня была такая же проблема при работе над моим приложением. DUMP и GC (From Logcat) показывали, что я использую около 30-50 МБ памяти, колеблющиеся вверх и вниз, что нормально, поскольку GC работает в разное время.

Однако по какой-то причине кажется, что использование ОЗУ процесса просто наращивало и не освобождалось, особенно если у вас есть работающий сервис. Мой процесс показал, что я набрал более 300 МБ ОЗУ, поэтому я не был уверен, что он просто не выпущен (GCed уже), или он просочился.

Что я сделал, чтобы проверить это, я позволю ему некоторое время после закрытия приложения, и через несколько часов он показал, что моя служба использует только 3 МБ ОЗУ, также я открыл много приложений (чтобы заставить Android для выполнения GC), и снова он вернулся с 300 МБ до 3 МБ, не убивая моего сервиса, поэтому я предполагаю, что он просто наращивал его без GCing, поэтому он не просочился.

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

Пожалуйста, дайте мне знать, если вы когда-нибудь придумаете решение этой проблемы, спасибо.