Утечка памяти Android? - PullRequest
       9

Утечка памяти Android?

15 голосов
/ 18 ноября 2011

Я думаю, что у моего андроид-приложения течет память.Я не совсем уверен, что это проблема, хотя.

Время от времени происходит сбой приложения при открытии, и logcat показывает исключение «недостаточно памяти» при попытке загрузить растровое изображение.

После сбоя я снова открываю приложение, и оно работает нормально.Logcat показывает много «gc», и время от времени размер таблицы JIT изменяется вверх, а не вниз, пока приложение не завершится с ошибкой нехватки памяти.

Похоже ли это на утечку памяти?Если так, как мне найти и устранить утечку?

Вот моя оболочка adb для моего приложения.

** MEMINFO in pid 2691 [com.example.deepcliff] **
                    native   dalvik    other    total
            size:    23264     8839      N/A    32103
       allocated:    12503     3826      N/A    16329
            free:      168     5013      N/A     5181
           (Pss):     2512     1395    13815    17722
  (shared dirty):     2088     1844     5008     8940
    (priv dirty):     2412      224    11316    13952

 Objects
           Views:        0        ViewRoots:        0
     AppContexts:        0       Activities:        0
          Assets:        2    AssetManagers:        2
   Local Binders:       55    Proxy Binders:       13
Death Recipients:        1
 OpenSSL Sockets:        0

 SQL
               heap:      129         MEMORY_USED:      129
 PAGECACHE_OVERFLOW:        9         MALLOC_SIZE:       50

 DATABASES
      pgsz     dbsz   Lookaside(b)  Dbname
         1       14             10  webview.db
         1        6             18  webviewCache.db

 Asset Allocations
    zip:/data/app/com.example.deepcliff-2.apk:/resources.arsc: 17K

Ответы [ 4 ]

33 голосов
/ 18 ноября 2011

Вот пара статей и постов, которые, вероятно, помогут вам встать на правильный путь:

Трекер распределения , который поставляется с Android SDK, очень полезен. Читайте статьи Ромена Гая. Это помогло мне отследить довольно неприятные утечки. Это также поможет вам написать лучшее программное обеспечение. Например. Я научился создавать меньше объектов, использовать больше StringBuilder и кешировать намного больше:
Какие инструменты и методы Android лучше всего подходят для обнаружения утечек памяти / ресурсов?

Иногда ваше приложение просто настолько испорчено, что вам приходится перепроектировать его в целом. Вот официальные, хорошие подсказки для этого (мой фаворит - Избегайте создания ненужных объектов ):
http://developer.android.com/guide/practices/design/performance.html


Вот отличная статья об атаке на проблемы с памятью:
http://ttlnews.blogspot.com/2010/01/attacking-memory-problems-on-android.html

Официальная статья об избежании утечек памяти:
http://android -developers.blogspot.co.uk / 2009/01 / избегая-памяти leaks.html

Читайте также это: инструмент для проверки утечек памяти в Android


Другие уже указали на растровые изображения . Вот статья, описывающая проблему: http://zrgiu.com/blog/2011/01/android-bitmaps-and-out-of-memory-errors/

2 голосов
/ 18 ноября 2011

Типичное значение максимального размера кучи виртуальной машины приложения составляет 24 МБ.Так, например, если ваше изображение имеет размер 10Mpx (3600 x 2400), то оно выделит 3600 x 2400 x 4 = 34'560'000 байтов, что является OutOfMemoryError случаем.

2 голосов
/ 18 ноября 2011

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

1 голос
/ 20 марта 2012

При работе с растровыми изображениями в Android убедитесь, что вы перерабатываете растровое изображение всякий раз, когда используете его. Вы можете загрузить растровое изображение с измененным размером, установив опцию inSampleSize. Подробнее здесь: http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inSampleSize

...