Странное управление памятью приложений

#android #memory #memory-management #android-activity #memory-leaks

#Android #память #управление памятью #android-активность #утечки памяти

Вопрос:

Я разрабатываю приложение для Android, и я думаю, что оно ведет себя довольно необычно. Когда я запускаю приложение, отойдите от него, нажав кнопку «Назад», и проверьте раздел «Кэшированные фоновые процессы» в диспетчере приложений Android, он показывает мне, что кэшированный фоновый процесс моего приложения потребляет ~ 10 МБ ОЗУ. Ну, это кажется совершенно нормальным, но, однако, каждый раз, когда я открываю его снова и закрываю, нажимая кнопку «Назад», а затем проверяю потребление памяти приложения, оно всегда увеличивается на ~ 800 КБ, это означает, что если я открою свое приложение 10 раз и проверю его потребление памяти, я вижу, что теперь оно потребляет 10 МБ 10 * 800 кБ = 18 МБ. Потребление памяти увеличивается с каждым повторением основного действия приложения (это означает, что я тоже поворачиваю экран), пока оно не достигнет ~ 28 МБ, затем оно уменьшается до ~ 23 МБ, а затем остается между 23 и 28 МБ независимо от того, сколько раз я его открываю. Это нормально или я должен подозревать утечку памяти?

Ответ №1:

Я предлагаю вам прочитать эту статью о том, как анализировать потребление памяти вашими приложениями с помощью MAT. http://android-developers.blogspot.com/2011/03/memory-analysis-for-android.html?m=1 Это уже помогало мне находить утечки раньше.

Две из наиболее распространенных ошибок, которые я видел: 1. Длительные ссылки на контекст (например, что-то, содержащее ссылку. к вашей деятельности) 2. Обработка растровых изображений

Комментарии:

1. Ну, я не думаю, что есть что-то, содержащее ссылку на мою активность, потому что единственное, что я запускаю из своей активности, — это фрагмент, и он уничтожается вместе с моей активностью, поэтому он не может содержать ссылку, когда она уничтожается. Или это может быть? Я вижу в журналах, что вызываются методы onDestroy() как моей активности, так и моего фрагмента. И я уверен, что я не использую никаких растровых изображений.

2. И я не говорю, что подозреваю утечку памяти. Я просто спрашиваю, должен ли я беспокоиться о таком поведении моего приложения. Потребление оперативной памяти увеличивается с каждым повторением основной активности моего приложения, пока не достигнет некоторой точки, а затем останавливается там, поднимаясь и опускаясь на пару МБ.

3. Я не знаю, что именно вы имеете в виду, говоря «пользовательские представления, как в нестандартных представлениях», но да, я использую пару небольших изображений исправлений 9. Но вы имеете в виду, что неиспользуемые объекты должны получить GCed сразу после того, как я прекращу действие? Может быть, они получают GCed только тогда, когда использование памяти достигает определенной точки? В моем случае это было бы ~ 28 МБ, как я упоминал в своем вопросе, потому что тогда объем памяти немного уменьшается. Кстати, мое приложение полностью очищается из памяти через некоторое время, если я его не использую. Таким образом, это может означать, что нет удерживаемых ссылок.

4. Под пользовательскими представлениями я имел в виду: developer.android.com/training/custom-views/index.html . В любом случае, когда вы поворачиваете экран, потребление памяти увеличивается, потому что приложение должно рассчитать, как масштабировать изображение («скрытая обработка изображений»), поэтому оно будет занимать больше места в куче. Я заметил значительное увеличение производительности, когда вы можете заменить 9-patches на drawables. Недавно я написал короткий пример о том, как заменить изображения пользовательскими чертежами Android. novarata.com/look-ma-no-images .

5. Нет, я не использую такие представления. Тем не менее, мне нравится ваша идея о замене изображений чертежами. Я могу попытаться заменить свои 9 патчей, которые я использую для пользовательского макета вкладок, на чертежи, когда у меня будет немного свободного времени. Но сначала я должен найти утечку памяти или что-то еще, что вызывает странное управление памятью моего приложения.