Как понять, что происходит с памятью устройства Android, и устранить неполадки

Память – это важный и ограниченный ресурс на устройствах 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.

Структура руководства

Руководство состоит из следующих разделов, которые рекомендуется читать по порядку:

  1. Основные понятия. Основные технические принципы работы памяти Android.
  2. Инструменты для быстрой оценки. Использование meminfo, showmap и procstats для быстрой сортировки.
  3. Анализ памяти Java. Подробный анализ кучи Java с помощью AHAT.
  4. Битовые карты и память. Как изображения влияют на ОЗУ и как использовать инструменты для их профилирования.
  5. Анализ нативной памяти. Профилирование памяти C/C++ с помощью Perfetto и heapprofd.
  6. WebView и память. Сведения о многопроцессной архитектуре и объеме потребляемой памяти WebView.
  7. Код приложения – это память. Узнайте, как загрузка классов и раздувание DEX-файлов влияют на ОЗУ.
  8. Потоки и память. Анализ стоимости стеков нативных потоков.
  9. Локальность памяти и производительность. Понимание того, как шаблоны доступа к данным влияют на производительность ЦП.
  10. Привязки сервисов и состояния процессов. Узнайте, как зависимости между процессами влияют на оценку OOM.
  11. Устранение неполадок на уровне системы. Мониторинг PSI, LMK, ZRAM swap и вытеснения кэша страниц.
  12. Memory reclaim: eviction and swap – информация о memcg, charge и упреждающем возврате памяти с помощью memory.reclaim.
  13. Взаимодействие kswapd и lmkd. Узнайте, как kswapd и lmkd работают вместе при высокой нагрузке.
  14. Возврат страниц памяти ОС: Использование madvise и posix_fadvise для возврата неиспользуемых страниц кучи и кеша файлов ядру.
  15. Поддерживайте фоновую работу с помощью оптимизированного процесса. Перенесите фоновые службы и рабочие процессы в отдельный процесс, чтобы память интерфейса и графическая память не удерживались с повышенным приоритетом.

Предварительные требования и среда

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

  • Инструменты анализа. В этом руководстве в основном используются стандартные инструменты Android для оценки производительности, в том числе Perfetto, dumpsys meminfo, showmap и AHAT.
  • Права root. Для некоторых рабочих процессов диагностики на уровне системы, например для проверки нагрузки на память ядра или счетчиков PMU оборудования, требуются повышенные права root (adb root) на устройстве userdebug или в сборке эмулятора.

Начало работы: основные понятия