2011-11-17 2 views
15

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

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

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

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

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

** MEMINFO in pid 2691 [com.example.deepcliff] ** 
        native dalvik other total 
      size: 23264  8839  N/A3 
     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 
+0

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

+1

1.Да, нормально работает нормально. Он падает только после того, как я использовал его некоторое время, закрыл его и снова открыл. Поэтому, если это утечка описанного вами способа, где я могу найти ссылки на примеры моих действий. – Arjun

+0

Мне любопытно, влияет ли изменение ориентации (много) на определенные действия? Это сузило бы потенциальные ошибки. –

ответ

32

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

Распределение трекер, который поставляется с Android SDK является очень полезным. Читайте статьи Ромена Гая. Это помогло мне отследить довольно неприятные утечки. Это также поможет вам написать лучшее программное обеспечение. Например. Я научился создавать меньше объектов, использовать больше StringBuilder и кешировать намного больше:
What Android tools and methods work best to find memory/resource leaks?

Иногда ваше приложение настолько перепутано, что вам нужно его перепроектировать в целом. Вот официальные, хорошие намеки на что (мой любимый Избегайте создания ненужных объектов):
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

Читайте также: tool to check memory leaks in android


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

+0

Сохраняет ли код какие-либо действия или чертежи в статические переменные? Или любой из них хранится за пределами классов, которые их создали? Это действительно легко утечка тонны памяти, когда вы пытаетесь оптимизировать потребление памяти или распределения таким образом. Например. хранить битмапы в статические переменные при создании активности. Затем при каждом изменении ориентации приложение будет утечки памяти. –

+0

Я так не верю, по крайней мере, не намеренно. Я снова просмотрю свой код. Спасибо за ваши ссылки. – Arjun

+0

Итак, у меня есть пользователь, постоянно переключающийся между действиями, то есть они могут переключить 15 действий за 20 секунд. Может ли это быть причиной ошибки из памяти? Что мне делать, чтобы исправить это? Благодаря! –

2

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

+0

Извините, я отредактирую свой вопрос. Моим самым большим изображением является PNG размером около 600 КБ, который действует как «загрузочный» или заставка. – Arjun

+3

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

+0

У меня есть различные другие маленькие изображения для значков и т. Д. Если бы это был размер изображения, разве это не было бы легко воспроизводимым? Сейчас я должен открыть приложение, поиграть с ним в течение нескольких минут, затем закрыть и открыть его, чтобы получить ошибку. – Arjun

2

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

+0

Мое максимальное изображение составляет всего около 600 кб (png) (1,7 м пикселей). – Arjun

+0

@Arjun: Это уже ~ 6.8 MB растровое изображение в ОЗУ. Некоторые более старые устройства имеют только 16 МБ виртуальной кучи. –

+0

Хорошо, позвольте мне посмотреть, как уменьшить его размер. Откуда у вас был множитель «4»? – Arjun

1

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

Смежные вопросы