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

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

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

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

Звучит ли это как утечка памяти? Если да, то как я могу найти и закрыть утечку.

Вот мой memb shell для моего приложения.

** 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

Ответы

Ответ 1

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

Отслеживание отчислений, которое поставляется с 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/avoiding-memory-leaks.html

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


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

Ответ 2

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

Ответ 3

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

Ответ 4

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