Убийцы низкой памяти, Убийцы низкой памяти, Убийцы низкой памяти, Убийцы низкой памяти

Платформа Android исходит из того, что свободная память — это бесполезная трата памяти. Android постоянно пытается использовать всю доступную память. Например, система сохраняет приложения в памяти после их закрытия, чтобы пользователь мог быстро вернуться к ним. По этой причине устройства Android часто работают с очень небольшим количеством свободной памяти (см. Распределение памяти Android здесь ).

Процесс- демон Android Low Memory Killer (LMK) отслеживает состояние памяти работающей системы Android и реагирует на высокую нехватку памяти, убивая наименее важные процессы, чтобы поддерживать производительность системы на приемлемом уровне.

Чтобы решить, какой процесс уничтожить, демон LMK использует показатель нехватки памяти, называемый oom_adj_score , для определения приоритета запущенных процессов . Процессы с высоким рейтингом уничтожаются первыми. Фоновые приложения закрываются первыми; системные процессы, в последнюю очередь. В следующей таблице перечислены категории оценок LMK от высокой до низкой. Предметы в категории с самым высоким рейтингом в первой строке уничтожаются первыми:

Процессы Android ранжированы от наивысшего балла к низшему: фоновые приложения, предыдущее приложение, домашнее приложение,              службы, видимые приложения, приложение переднего плана, постоянное, системное и собственное.
Рисунок 1. Процессы Android: высокие оценки вверху и низкие оценки внизу.

Метрика LMK в Android Vitals

Android Vitals поможет вам отслеживать и улучшать показатель LMK вашего приложения. Android Vitals измеряет только один показатель LMK: показатель LMK, воспринимаемый пользователем .

Этот показатель отражает процент ваших ежедневных активных пользователей, которые испытали хотя бы один LMK, воспринимаемый пользователями. LMK, воспринимаемый пользователем, — это LMK, который, скорее всего, был замечен пользователем. Например, LMK, которые происходят, когда ваше приложение отображает активность или работает в качестве службы переднего плана.

Вы можете найти этот показатель в разделе «Стабильность» в Android Vitals:

Рисунок 2. Доступ к показателю LMK, воспринимаемому пользователем, в Android Vitals.

Как и в случае с другими основными важными показателями, такими как количество ошибок ANR и сбои, вы можете фильтровать показатели, сравнивать свои показатели с аналогичными или отслеживать изменения показателей в течение длительного периода времени (до 3 лет). Данные доступны для существующих приложений начиная с 28 января 2025 года.

Рисунок 3. Обзор ставки LMK в Android Vitals.

Инструменты профилирования памяти

Следующие инструменты могут помочь вам найти и диагностировать проблемы с памятью следующими способами:

  • Посмотрите, как ваше приложение распределяет память с течением времени. Вы можете найти в реальном времени график того, сколько памяти использует ваше приложение, количество выделенных объектов Java и время выполнения сборки мусора.
  • Инициируйте события сборки мусора и делайте снимок кучи Java во время работы вашего приложения.
  • Записывайте распределение памяти вашего приложения, проверяйте все выделенные объекты и просматривайте трассировку стека для каждого выделения.

Профилировщик памяти Android Studio

Android Studio предоставляет профилировщик памяти как компонент Android Profiler , который помогает выявлять утечки и перебои памяти, которые могут привести к зависаниям, зависаниям и даже сбоям приложений. Профилировщик показывает в реальном времени график использования памяти вашим приложением и позволяет создавать дамп кучи, принудительно собирать мусор и отслеживать распределение памяти.

Рисунок 4. Просмотр глобальных ссылок JNI в профилировщике памяти Android Studio.

Инструменты профилирования памяти Unity

Если вы используете Unity Engine для создания своих приложений, вы можете следовать руководству по профилированию памяти Unity . Unity предлагает два инструмента для анализа использования памяти в вашем приложении в Unity.

Первый — это модуль Memory Profiler , который представляет собой встроенный профилировщик, предоставляющий вам базовую информацию о том, где ваше приложение использует память.

Модуль памяти показывает распределение памяти, такое как память текстур и память сетки.
Рисунок 5. Окно Unity Profiler с выбранным модулем памяти .

Второй инструмент — это пакет Memory Profiler , который представляет собой пакет Unity, который вы можете добавить в свой проект. Пакет добавляет дополнительное окно профилировщика памяти в редактор Unity. Профилировщик памяти позволяет еще более детально анализировать использование памяти в вашем приложении. Вы можете хранить и сравнивать снимки, чтобы обнаружить утечки памяти, или просмотреть структуру памяти, чтобы обнаружить проблемы фрагментации памяти.

Рисунок 6. Анализ снимка памяти с помощью окна Memory Profiler.

Нереальная информация о памяти

Приложения, созданные с помощью Unreal Engine, могут использовать Unreal Memory Insights для просмотра подробной информации о выделении и освобождении памяти, включая теги памяти низкого уровня (LLM) и стеки вызовов, связанные с блоками памяти.

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

Начиная с UE 5.4, Memory Insights поддерживает трассировку памяти с помощью стеков вызовов для проектов Android.

Трекер Memory Insights, показывающий график основной памяти, количество выделений в реальном времени и количество событий выделения/освобождения.
Рисунок 6. Трекер Unreal Memory Insights.

Низкая память

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

Обратные вызовы

Не регистрируйтесь для устаревших обратных вызовов обрезки . В Android нет API-интерфейсов для обнаружения событий нехватки встроенной памяти, когда система достигает пределов памяти. Обратные вызовы Trim не помогли предотвратить уничтожение нехватки памяти, поэтому Android объявил устаревшими все из них, кроме TRIM_MEMORY_UI_HIDDEN и TRIM_MEMORY_BACKGROUND .

Прекращение игры

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

Информация, идеи и рекомендации, которые помогут вам лучше использовать игровую память, включают следующее:

  • Используйте ApplicationExitInfo : этот API возвращает причину, по которой предыдущий запуск игры был прекращен системой Android. Используйте ApplicationExitInfo для проверки нехватки памяти как причины смерти предыдущего запуска процесса. Проверьте, не была ли игра завершена из-за нехватки памяти, чтобы можно было оптимизировать игру для использования меньшего количества памяти на этом устройстве.
  • Посмотрите на общий объем физической оперативной памяти . Чтобы игры не закрывались на переднем плане, а также для соответствия возможностям устройства, посмотрите на общий объем физической оперативной памяти на устройство для более детальной детализации и на основе этого скорректируйте использование игровой памяти. Если цель состоит в том, чтобы предотвратить завершение работы приложений вскоре после перехода в фоновый режим (чтобы позволить игроку выполнять многозадачность), используйте обратные вызовы обрезки (в частности, TRIM_MEMORY_UI_HIDDEN ), чтобы уменьшить использование игровой памяти.

Дополнительные ресурсы