Оптимизация потребления оперативной памяти мобильного приложения

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.
Разработка и поддержка любых видов мобильных приложений:
Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

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

Предлагаемые услуги
Показано 1 из 1 услугВсе 1735 услуг
Оптимизация потребления оперативной памяти мобильного приложения
Сложная
~3-5 рабочих дней
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    760
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    649
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1071
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    884
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    456

Оптимизация потребления оперативной памяти мобильного приложения

iOS убивает приложения молча — без краша, без OutOfMemoryError. Пользователь свернул, открыл, а данные пропали — приложение перезапустилось. Android присылает onLowMemory и onTrimMemory, но если разработчик их игнорирует — процесс тоже умирает. Избыточное потребление памяти — это не только crashes, это degraded UX каждый день.

Где утекает память: Android

Android Memory Profiler в Android Studio — обязательный инструмент. Снимаем heap dump, сортируем по retained size, ищем неожиданно большие объекты или классы, которых должно быть несколько, а их тысячи.

Bitmap утечки. До Glide и Coil разработчики вручную декодировали Bitmap и держали их в статических полях или Map. Сейчас эта проблема встречается реже, но Glide неправильно использованный может кэшировать полноразмерные изображения вместо downsampled. Правило: override(width, height) в Glide-запросах для ImageView, размер которых заранее известен. Bitmap размером 2048x2048 для аватарки 48dp — это 16 МБ впустую.

Fragment/Activity утечки через анонимные классы. Handler, Runnable, лямбды с захватом this — классические паттерны, которые держат ссылку на Activity после её уничтожения. LeakCanary находит такие утечки автоматически в debug-сборке. Обязательно включаем в CI.

ViewModel с неотписанными наблюдателями. LiveData наблюдатели, привязанные к LifecycleOwner, автоматически отписываются. Но прямые подписки на Flow без collectAsStateWithLifecycle или без явного Job.cancel при onDestroy создают утечки.

RecyclerView с большими payload. ListAdapter + DiffUtil — правильный подход, но если Adapter хранит полный список в поле, а не только текущий видимый диапазон — это лишняя память. Paging 3 решает это для длинных списков.

Где утекает память: iOS

Xcode Memory Graph Debugger — главный инструмент. Показывает retain cycles визуально. Instruments → Allocations — для отслеживания роста памяти во времени.

Retain cycles в closure. [weak self] в замыканиях, которые захватывают self — это не перестраховка, это необходимость для любых замыканий, живущих дольше функции. Особенно коварны цепочки: ViewModel → Closure → ViewController → ViewModel.

NSCache без лимитов. NSCache автоматически чистится при memory pressure, но если не задать countLimit и totalCostLimit — он может вырасти до нескольких сотен МБ до первого предупреждения.

Изображения в UIImageView без downsampling. UIImage(named:) кэширует изображение и не освобождает его. UIImage(contentsOfFile:) не кэширует, но требует ручного управления. Для больших изображений — ImageIO с kCGImageSourceShouldCacheImmediately = false и downsampling через CGImageSourceCreateThumbnailAtIndex.

NotificationCenter наблюдатели без removeObserver. В Obj-C это crash, в Swift (до iOS 9) тоже. С iOS 9+ block-based observers самоочищаются, но selector-based нет. В Swift комбо deinit { NotificationCenter.default.removeObserver(self) } — обязателен для UIKit.

Flutter и React Native

В Flutter утечки памяти чаще всего связаны с StreamSubscription без cancel() и AnimationController без dispose(). Dart DevTools → Memory показывает граф объектов. Типичная ловушка: StatefulWidget создаёт StreamSubscription в initState, но в dispose его не отменяет — каждое пересоздание виджета добавляет новую подписку.

В React Native основная проблема — накопление native объектов при навигации без правильного unmount. react-navigation с unmountOnBlur: true для тяжёлых экранов решает часть проблем. Flipper с Memory plugin показывает нативную память отдельно от JS heap.

Процесс оптимизации

Этап Инструмент Цель
Baseline measurement Android Profiler / Xcode Instruments Зафиксировать текущее потребление
Heap dump analysis MAT (Android) / Memory Graph (iOS) Найти retain cycles и unexpected retentions
Stress testing Monkey / XCUITest Выявить утечки при длительной работе
LeakCanary / Instruments CI integration Не допустить регрессию

Целевые значения зависят от типа приложения: простой CRUD — 50-80 МБ в норме, медиаплеер или карты — 150-200 МБ приемлемо.

Срок работы — одна-три недели: неделя на диагностику и профилирование, одна-две на исправления и верификацию.