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