Android 6: приложение использует больше памяти каждый раз при запуске

Samsung Galaxy S6 с Android 6.0.0 и 6.0.1

Мое приложение работает нормально, анализ кода не показывает никаких утечек памяти. SmartManager показывает, что приложение использует ~ 40 МБ памяти. Я убиваю приложение (используя обзор "текущие приложения" --- не уверен, как это вызвано на английском языке, извините. Ключ в нижней левой части телефона, в котором показан список миниатюр всех запущенных приложений...), затем запустите его снова.

Теперь SmartManager больше не показывает ~ 40 МБ памяти для моего приложения, но... больше. 50. 100. 400. Оно меняется, но растет каждый раз. Через некоторое время мое приложение аварийно завершает с помощью OutOfMemoryException. Иногда даже с "нехваткой памяти при попытке выбросить OutOfMemoryException"...

Мне нужно деинсталлировать и переустановить приложение, чтобы reset его потребление памяти. Тот же APK ведет себя правильно на всех других телефонах, которые я тестировал (например, S5 с Android 5.0). Не знаю, что вызывает это. Не знаю, что может вызвать это! Любая помощь/подсказки/предложения...?

Изменить: То же поведение на S5 с Android 6.0.1, но не на S5 с Android 5.0!

Edit2: Спасибо, всем, кто внес свой вклад. У меня все еще нет ответа, что я доволен, но было упомянуто несколько идей, которые я буду изучать. Большинство людей сосредоточилось на проблеме MemLeak, и хотя это звучит разумно, я хотел бы подчеркнуть, что на Android 4 или 5 нет утечки, только 6. (мне еще предстоит проверить 7.) Кроме того, утечка возникает только когда я принудительно убиваю приложение (что мне нужно делать порой, чтобы проверить правильное выключение и повторное начало поведения), и только без прикрепленного отладчика (что делает тестирование/отладку этого поведения болью на обратной стороне).

Приложение запускает одну службу как связанную службу. Связанный с контекстом приложения --- который согласно документам должен очищаться, когда приложение останавливается. К несчастью, время для этой щедрости заканчивается. До сих пор вышеупомянутая услуга, по-видимому, является наиболее вероятным источником моей проблемы. Таким образом, я награду Qamar щедростью, поскольку он первым упомянул об этом как в комментариях, так и в своем ответе. Остальная часть вас, большая СПАСИБО и голосуйте.

Ответ 1

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

Ответ 2

В Android Studio нажмите Android Monitor в нижней части экрана. Перейдите на вкладку Monitors. Вы видите график памяти, который использует ваше приложение. Теперь щелкните элемент Dump Java Heap, который находится рядом с мусором. Система начинает сбор информации и создает файл дампа. Вы можете открыть файл на вкладке Analyze Tasks в правом верхнем углу окна Android Studio. Нажмите зеленую стрелку, чтобы найти классы, в которых происходит утечка памяти. Когда вы нажмете текущую активность, вы увидите окно Reference Tree. Пройдите через дерево, найдя член, который имеет глубину нуля. Это утечка памяти.

Ответ 3

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

Ответ 4

Некоторые люди считают, что убийцы задач важны для Android. Закрывая приложения, работающие в фоновом режиме, вы получите улучшенную производительность и время автономной работы - в любом случае, идея. В действительности, убийцы задач могут снизить вашу производительность. Android - это не Windows и не управляет такими процессами, как Windows. В отличие от Windows, где theres - очевидный способ закрыть приложения, нет очевидного способа "закрыть" приложение для Android. Это по дизайну и не проблема. Когда вы покидаете приложение для Android, возвращаясь на свой домашний экран или переключаясь на другое приложение, приложение остается "работает" в фоновом режиме. В большинстве случаев приложение будет приостановлено в фоновом режиме, не занимая центральных или сетевых ресурсов. Некоторые приложения будут продолжать использовать ресурсы центрального процессора и сети в фоновом режиме, например, музыкальные проигрыватели, программы загрузки файлов или приложения, которые синхронизируются в фоновом режиме. Когда вы вернетесь в приложение, которое вы недавно использовали, Android "отключает" "это приложение и вы возобновляете, где вы остановились. Это быстро, потому что приложение все еще хранится в вашей ОЗУ и готово к использованию снова, поэтому не потребляет никаких дополнительных ресурсов.

Убийцы задач, такие как умный менеджер, считают, что они знают лучше, чем Android. Они запускаются в фоновом режиме, автоматически покидая приложения и удаляя их из памяти Androids. Они также могут позволить вам принудительно закрыть приложения самостоятельно, но вам не обязательно делать это нормально. Если убийца задачи удалит приложение из вашей RAM, и вы снова откроете это приложение, приложение будет медленнее загружаться, так как Android вынуждены загружать его из хранилища устройств. В дальнейшем s6 имеет Smart Manager и может использоваться в качестве виджета или ярлыка для настроек батареи и памяти, однако вам следует избегать использования функции "Очистить все". Говорят, что эта функция улучшает производительность устройства - как это делает приложение Clean Master, но его фактическое воздействие вызывает сомнения.

В то время как вы иногда убиваете приложение, он все равно может оставить следы на куче, поэтому в следующий раз, когда вы его запустите, он будет отображать различное количество используемого хранилища, которое также не соответствует понятию по умолчанию maxMemory(), и приложение в конечном итоге может упасть. Кроме того, такие утечки трудно отслеживать, поскольку они не связаны напрямую с приложением, которое вы убили в первом экземпляре. Но иногда даже после убийства приложения некоторые функции, такие как достигнутые ресурсы, могут продолжать работать в фоновом режиме, даже если приложение даже не знает о них. незаметные утечки. Поэтому вы можете использовать maxMemory()

который может быть вызван (например, в вашем основном действии onCreate()) следующим образом:

Runtime rt = Runtime.getRuntime();
long maxMemory = rt.maxMemory();
Log.v("onCreate", "maxMemory:" + Long.toString(maxMemory));

Этот метод сообщает вам, сколько всего байтов кучи вашего приложения разрешено использовать. Оптимальное поведение: Приложение может оставаться "бегущим" в фоновом режиме без каких-либо процессов, израсходованных на ваши телефонные ресурсы. Android сохраняет приложение в своей памяти, поэтому он запускается быстрее и возвращается в прежнее состояние. Когда в вашем телефоне заканчивается память, Android автоматически начнет убивать задачи самостоятельно, начиная с тех, которые вы не использовали некоторое время. Что вы должны делать вместо этого

Тем не менее, не все приложения созданы равными. Многие из вас использовали убийцы задач в прошлом и фактически обнаружили, что после освобождения памяти ваш телефон работает немного лучше. Скорее всего, это потому, что вы убили плохое приложение, которое было плохо закодировано, и (например) продолжает пытаться подключиться к Интернету, даже если это не так. Любое повышение производительности, которое вы испытываете, более вероятно, потому что вы убили правильное приложение, а не потому, что вы освободили массу памяти (или, во многих случаях, просто плацебо). Вместо того, чтобы убивать все эти приложения, выясните, какие из них на самом деле вызывают проблемы. Использование убийцы задач для работы с неправильным приложением - это как использовать дробовик, чтобы убить муху - вы можете исправить свою проблему, но вы причиняете много других повреждение в процессе. Теперь поскольку у S6 есть 3 гигабайта, у него не должно быть проблем, однако реализация умного менеджера может вызвать проблемы с некоторыми приложениями и не обязательно зависит от версии Android. Также голый, что heapsize, как правило, больше основан на разрешении экрана, так как более высокое разрешение экраны, как правило, хотят манипулировать большими растровыми изображениями. Вместо использования убийцы задачи в этой ситуации вы должны определить плохое приложение, удалить его или отладить, заменив его приложением, которое работает правильно. Чтобы настроить приложение, которое не соответствует действительности, вы можете попробовать

Приложение "Диспетчер задач Watchdog"

- он покажет вам, какие приложения фактически используют процессор в фоновом режиме, а не какие приложения безвредно хранятся в памяти.

Увлекательный факт:

CyanogenMod, популярный в сообществе Android ROM, даже принимать отчеты об ошибках от пользователей, использующих убийцы задач, заявляя, что они вызывают больше проблем, чем они решают.

Возможная причина проблемы

если вы можете попробовать сразу же, прежде всего, перейдите в настройки > звуки и уведомления > Уведомления приложений > выберите интеллектуальный менеджер и выберите скрытие содержимого на экране блокировки

затем снова вернуться к настройкам перейдите в блокировку экрана и безопасность > Безопасность устройствa > Отключите активную защиту KNOX и отключите опцию антивирусной защиты ниже активной защиты KNOX

в окне блокировки и безопасности перейдите к другим параметрам безопасности > отключите отправку отчетов о безопасности и спуститесь к доступу к данным Ussage > отключите интеллектуальный менеджер, после чего перезапустите устройство. Теперь посмотрите, работает ли приложение Также см. проблемы производительности с s6