Растровые изображения часто являются самыми большими объектами, потребляющими больше всего памяти в приложении. Операции декодирования и масштабирования часто находятся на критическом пути для рендеринга кадров. Оптимизация использования памяти для растровых изображений обеспечивает значительное улучшение отзывчивости пользовательского интерфейса, времени автономной работы и общей стабильности за счет уменьшения рывков, ошибок ANR и завершений процессов, связанных с нехваткой памяти.
Выявление случаев чрезмерного использования памяти для растровых изображений.
Android Vitals предоставляет метрики по объему используемой приложением памяти, агрегируя данные с устройств Android. По умолчанию эти метрики рассчитываются как 28-дневная сводка ежедневных данных. Эти данные помогают выявлять тенденции и потенциальные регрессии в эффективности использования памяти на разных типах и версиях устройств.
Android Vitals отображает использование памяти, предназначенной для отображения растровых изображений, в разбивке по следующим состояниям процесса :
- В фоновом режиме : процесс приложения виден. Ожидается, что показатель P99 будет значительно выше в фоновом режиме по сравнению с другими состояниями процесса, но разработчикам следует проверить, является ли соотношение P99/P50 значительным (например, выше 3,5x), поскольку это часто указывает на утечку памяти в битовой карте. Это можно определить, наблюдая расхождение между типичным использованием (P50) и аномальным использованием (P99); в то время как общее раздувание ресурсов равномерно увеличивает объем памяти по всем процентилям, утечки памяти накапливаются со временем, сильно искажая данные в конце процесса (P99). Убедитесь, что выделение битовой карты в фоновом режиме не сохраняется без необходимости после перехода приложения в другие состояния.
- Воспринимаемые пользователем службы : процесс приложения находится в воспринимаемом пользователем состоянии. Это включает в себя службы переднего плана , ускоренные задачи и задачи передачи данных, инициированные пользователем . Приложения не должны сохранять большие объемы выделенной памяти для битовых карт переднего плана при переходе в эти состояния. Поскольку эти службы предназначены для длительных задач, сохранение больших объемов данных ухудшает общее впечатление от использования и заставляет демон LMKD (Low Memory Killer Daemon) освобождать память, завершая процессы с более низким приоритетом.
- Фоновый режим : Приложение работает в фоновом режиме или недавно было переведено в фоновый режим, но еще не кэшировано. Поскольку это состояние процесса менее важно, чем состояние процессов переднего плана или видимых процессов, приложениям следует явно освобождать большие растровые изображения именно в этот момент, чтобы снизить нагрузку на память.
- Кэшированное состояние : Приложение находится в кэшированном состоянии. Это состояние очень чувствительно к нагрузке на системную память, например, из-за LMK-сообщений. Приложения должны заблаговременно сокращать использование памяти для растровых изображений в этом состоянии, чтобы избежать вытеснения данных операционной системой.
Факторы, способствующие высокому уровню использования памяти для растровых изображений.
В расчет также может быть включена виртуальная память, которая никогда не использовалась. Если вы наблюдаете неожиданно высокое использование памяти для битовых карт, убедитесь, что вы не выделяете память, которая не используется.