Память – это важный и ограниченный ресурс на устройствах Android. Разработчикам платформы Android и OEM-производителям необходимо понимать, как работает память на всех уровнях – от среды выполнения Java до ядра Linux. Это позволяет создавать производительные и стабильные системы.
В этом руководстве подробно рассказывается об архитектуре памяти Android, инструментах для ее анализа и практических упражнениях, которые помогут вам выявлять и устранять проблемы, связанные с памятью.
Цели
Из этого руководства вы узнаете:
- Объяснять основные концепции памяти Android, включая модель процесса Zygote и файлы, сопоставленные с памятью.
- Различайте Resident Set Size (RSS), Proportional Set Size (PSS) и Unique Set Size (USS).
- Используйте стандартные инструменты командной строки, такие как
dumpsys meminfoиshowmap, чтобы быстро оценить использование памяти. - Записывайте и анализируйте дампы кучи Java с помощью AHAT, чтобы находить утечки и избыточные выделения памяти.
- Используйте Perfetto и
heapprofd, чтобы профилировать память Java и нативную память во всей системе. - Изучите индикаторы нехватки памяти на уровне системы, такие как Pressure Stall Information (PSI), и отслеживайте активность Low Memory Killer (LMK).
- Отслеживайте действия по освобождению памяти на уровне ядра, включая вытеснение кэша страниц и подкачку ZRAM.
Структура руководства
Руководство состоит из следующих разделов, которые рекомендуется читать по порядку:
- Основные понятия. Основные технические принципы работы памяти Android.
- Инструменты для быстрой оценки. Использование
meminfo,showmapиprocstatsдля быстрой сортировки. - Анализ памяти Java. Подробный анализ кучи Java с помощью AHAT.
- Битовые карты и память. Как изображения влияют на ОЗУ и как использовать инструменты для их профилирования.
- Анализ нативной памяти. Профилирование памяти C/C++ с помощью Perfetto и
heapprofd. - WebView и память. Сведения о многопроцессной архитектуре и объеме потребляемой памяти WebView.
- Код приложения – это память. Узнайте, как загрузка классов и раздувание DEX-файлов влияют на ОЗУ.
- Потоки и память. Анализ стоимости стеков нативных потоков.
- Локальность памяти и производительность. Понимание того, как шаблоны доступа к данным влияют на производительность ЦП.
- Привязки сервисов и состояния процессов. Узнайте, как зависимости между процессами влияют на оценку OOM.
- Устранение неполадок на уровне системы. Мониторинг PSI, LMK, ZRAM swap и вытеснения кэша страниц.
- Memory reclaim: eviction and swap – информация о memcg, charge и упреждающем возврате памяти с помощью
memory.reclaim. - Взаимодействие kswapd и lmkd. Узнайте, как kswapd и lmkd работают вместе при высокой нагрузке.
- Возврат страниц памяти ОС: Использование
madviseиposix_fadviseдля возврата неиспользуемых страниц кучи и кеша файлов ядру. - Поддерживайте фоновую работу с помощью оптимизированного процесса. Перенесите фоновые службы и рабочие процессы в отдельный процесс, чтобы память интерфейса и графическая память не удерживались с повышенным приоритетом.
Предварительные требования и среда
В этом руководстве представлены примеры рабочих процессов, контрольные данные и примеры из практики, демонстрирующие, как диагностировать и устранять проблемы с памятью Android.
- Инструменты анализа. В этом руководстве в основном используются стандартные инструменты Android для оценки производительности, в том числе Perfetto,
dumpsys meminfo,showmapи AHAT. - Права root. Для некоторых рабочих процессов диагностики на уровне системы, например для проверки нагрузки на память ядра или счетчиков PMU оборудования, требуются повышенные права root (
adb root) на устройстве userdebug или в сборке эмулятора.
Начало работы: основные понятия