2013-01-29 2 views
1

У меня странное поведение памяти в приложении для Android, которое я разрабатываю. Приложение работает нормально, но если я смотрю на «диспетчер задач» на Android, например, на диспетчер задач Samsung SII или приложение «Memory Usage» на Nexus 7, это показывает, что при использовании приложения объем используемой памяти быстро растет к сумасшедшей сумме, например, сотням мегаданных (600 ~ 700 МБ на Nexus 7). Затем он может упасть до 200 МБ, снова расти и т. Д.Странное поведение памяти в приложении для Android

Сначала я подумал, что у меня плохая утечка памяти, и начал искать проблему в Eclipse Memory Analyzer (MAT), как это объясняется в этом excellent video. Но проблема в том, что отсюда все выглядит нормально. Я не нашел дублирующего экземпляра активности или чего-либо еще, что могло бы вызвать утечку, а количество использованной памяти было намного меньше. Проблема также не появляется в сообщениях GC. Таким образом, я могу иметь использование 600MB сообщили в диспетчере задач, и что-то подобное в LogCat:

01-29 12:05:44.511: D/dalvikvm(6044): GC_FOR_ALLOC freed 3930K, 24% free 28959K/38096K, paused 17ms, total 17ms 

с суммой кучи никогда не будет выше 50 ~ 60MB (который может быть нормальным, потому что есть много фотографий в приложение). Числа в матче совпадают.

Я хотел бы убедиться, что есть утечка памяти или нет в моем приложении. Даже если сообщения GC и MAT не сообщают о проблемах, мне очень странно, что диспетчеры задач сообщают о таком высоком использовании памяти. Может, кто-то здесь уже столкнулся с таким странным поведением и мог дать мне понять, что происходит?

ответ

1

Сообщения GC показывают только то, что находится на куче Dalvik. Нативная куча может расти без ограничений - пока система не решит убить вас, что она неохотно делает, пока вы находитесь на переднем плане. У вашего приложения есть собственный компонент, который может вызывать распределение?

Если это разработчик/внедренное устройство, инструмент «procrank» может дать вам краткое резюме использования памяти. Инструмент «showmap» может дать вам более подробную разбивку.

DDMS имеет некоторые (официально неподдерживаемые) инструменты для изучения использования собственной памяти. Google для «ddms native heap», чтобы найти некоторые инструкции.

1

Хорошо, после нескольких часов тестирования я, наконец, нашел проблему. Как догадался Фадден, утечка была вне сферы Дальвика. Это было на самом деле из-за следующей ошибки в Typeface.createFromAsset:

http://code.google.com/p/android/issues/detail?id=9904

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

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