Что означает ошибка OOM на Android
OutOfMemoryError (OOM) — это критическая ошибка Java-виртуальной машины (ART на Android), которая возникает, когда приложению или системе не хватает оперативной памяти (RAM) для выделения нового объекта. В логах вы можете видеть:
java.lang.OutOfMemoryError: Failed to allocate a 20971520-byte allocation with 4194304-byte free memory and 64MB until OOM
Ошибка приводит к мгновенному завершению (крашу) приложения или даже всей системы (если проблема в системном процессе). Чаще всего она появляется при:
- Запуске «тяжёлых» игр или приложений для редактирования фото/видео.
- Быстром переключении между несколькими тяжёлыми приложениями.
- Фоновой работе сервисов (мессенджеры, стриминговые приложения).
Причины возникновения
- Утечки памяти (Memory Leak) в приложении. Например, фрагмент или активность не освобождает ссылки на контекст (
Context), что не даёт сборщику мусора (Garbage Collector) очистить память. - Загрузка слишком больших ресурсов без их сжатия (изображения в full resolution, несжатые аудио/видео).
- Слишком много фоновых процессов. Современные оболочки (One UI, MIUI) агрессивно удерживают приложения в памяти, что быстро её заполняет.
- Бесконечные циклы или рекурсия в коде, создающие объекты без очистки.
- Некорректная работа системных сервисов (особенно на кастомных прошивках или после обновления ОС).
Способы решения
Способ 1: Очистка кеша и данных приложения (быстрое решение)
Часто помогает, если проблема в конкретном приложении (игра, соцсеть).
- Откройте Настройки → Приложения.
- Найдите проблемное приложение (то, которое падает) и тапните по нему.
- Выберите Память (или Хранилище).
- Нажмите «Очистить кеш», затем «Очистить данные» (последнее сбросит настройки и вход в аккаунт).
⚠️ Важно: Очистка данных удалит локальные файлы (сохранения в играх, кэшированные сообщения). Убедитесь, что они синхронизированы с облаком.
Способ 2: Управление фоновыми процессами и оптимизация памяти
Если OOM возникает в разных приложениях, возможно, система не справляется с нагрузкой.
- Включите оптимизацию памяти (на некоторых прошивках):
- Samsung: Настройки → Батарея и производительность → Режим энергосбережения (или «Оптимизировать»).
- Xiaomi/Redmi: Настройки → Батарея и производительность → Экономия заряда → Выбрать «Настраиваемые режимы» → Ограничить фоновую активность.
- Вручную закройте все фоновые приложения через Recent Apps (квадратная кнопка). На некоторых прошивках есть кнопка «Закрыть все».
- Отключите автозапуск ненужных приложений:
- В Настройки → Приложения → Приложение → Автозапуск (доступно на Xiaomi, Huawei, Honor). Отключите всё, кроме мессенджеров и системных сервисов.
Способ 3: Оптимизация изображений и медиафайлов (для разработчиков/пользователей)
Если вы разрабатываете приложение или имеете доступ к его файлам:
- Сжимайте изображения перед загрузкой в память. Используйте библиотеки like
GlideилиPicassoс автоматическим downsampling. - Разбейте большие изображения на тайлы (для карт).
- Не храните большие файлы в памяти — используйте потоковое чтение (
FileInputStream) вместоBitmapFactory.decodeFile.
Пример для Glide (Kotlin):
Glide.with(context)
.load(imageFile)
.override(1080, 1920) // явно задаём размер
.into(imageView)
Способ 4: Использование Android Studio Profiler для поиска утечек
Если вы разработчик, это самый точный способ.
- Запустите приложение на устройстве/эмуляторе в Android Studio.
- Откройте Profiler (View → Tool Windows → Profiler).
- Выберите вкладку Memory и нажмите Record.
- Воспроизведите действия, приводящие к OOM (например, открытие фрагмента много раз).
- Остановите запись и проанализируйте Heap Dump. Ищите объекты с большим retained size, которые не собираются мусором (например,
ActivityилиContext).
💡 Совет: Обратите внимание на
static-поля, которые хранят контекст, и на неочищённыеListener'ы.
Способ 5: Сброс к заводским настройкам (крайняя мера)
Если проблема системная и не решается другими способами (например, после кастомной прошивки):
- Сделайте полный бэкап всех данных (фото, контакты, сообщения).
- Перейдите в Настройки → Сброс → Сброс настроек (или «Сброс до заводских»).
- Подтвердите и дождитесь перезагрузки.
- Настройте устройство заново и восстанавливайте данные.
⚠️ Внимание: Удалит все данные с телефона, включая установленные приложения и их данные.
Профилактика
- Регулярно обновляйте приложения и систему — в обновлениях часто исправляют утечки памяти.
- Не устанавливайте «тяжёлые» кастомные оболочки (например, некоторые порты LineageOS) на устройства с малым RAM (<4 ГБ).
- Используйте «Лёгкие» альтернативы для соцсетей (например, Facebook Lite) и браузеров (Hermit).
- Включайте режим энергосбережения при низком заряде — он ограничивает фоновую активность.
- Для разработчиков: всегда используйте
WeakReferenceдля контекста в долгоживущих объектах, тестируйте на устройствах с малым RAM (2-3 ГБ).
Часто задаваемые вопросы
❓ Можно ли как-то «увеличить» оперативную память на Android программно?
Нет. RAM — это физический ресурс. Можно только оптимизировать её использование (закрывать приложения, очищать кеш). Некоторые прошивки предлагают «виртуальную память» (сжатый swap на внутреннем хранилище), но это сильно замедляет работу.
❓ Почему после очистки кеша приложение работает, но потом снова падает?
Очистка кеша — временная мера. Если есть утечка памяти в коде приложения, проблема вернётся после того, как приложение снова начнёт накапливать объекты. Нужно ждать обновления от разработчика.
❓ Связана ли OOM ошибка с нехваткой места на диске?
Косвенно. Если на устройстве мало свободного места (<10%), система хуже управляет памятью и swap-файлами. Освободите хотя бы 1-2 ГБ.
❓ Как узнать, какое приложение «съедает» память?
- Настройки → Приложения → Три точки → Сортировать по размеру (покажет самые объёмные).
- Используйте Developer Options → Процессы в памяти (активируется в Настройки → О телефоне → Номер сборки — тап 7 раз). Там видно использование RAM каждым процессом.