Діагностика витоків пам'яті: iOS та Android

Діагностика витоків пам'яті: iOS та Android Додаток працює нормально перші 5 хвилин, потім починає гальмувати, а через 15 — вилітає. `NSLog: Received memory warning`. Це класична історія поступового витоку пам'яті, з якою ми стикаємося в нашій практиці: щось утримує об'єкти, RSS зростає, система

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1734 послуг
Діагностика витоків пам'яті: iOS та Android
Складний
~2-3 дні

Наші компетенції:

Часті запитання

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    894
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    1002
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    597

Діагностика витоків пам'яті: iOS та Android

Додаток працює нормально перші 5 хвилин, потім починає гальмувати, а через 15 — вилітає. NSLog: Received memory warning. Це класична історія поступового витоку пам'яті, з якою ми стикаємося в нашій практиці: щось утримує об'єкти, RSS зростає, система вбиває процес. Знайти, що саме утримує — завдання профілювальника пам'яті. Ми використовуємо Xcode Instruments та Android Memory Profiler для точного аналізу. Профілювання пам'яті — ключовий етап оптимізації, що дозволяє знизити витрати на хмарні ресурси на 20–30%. Наша команда має 5+ років досвіду, виконала понад 50 проектів з оптимізації. Наприклад, для одного замовника ми скоротили щомісячні витрати на хмарні сервери на €2000. Гарантуємо стабільну роботу під навантаженням.

Інструменти для профілювання пам'яті

Xcode Instruments — Allocations та Leaks

Allocations показує всі live-об'єкти в пам'яті. Найкорисніший вид — Generation Analysis: робимо Mark Generation перед дією, виконуємо дію кілька разів, дивимося, що накопичується.

Сценарій: відкриваємо DetailViewController, закриваємо, повторюємо 10 разів. В Allocations — кожного разу додається PhotoProcessingService об'єкт. Переходимо до Leaks — він будує граф об'єктів і знаходить циклічні посилання. Бачимо retain cycle через delegate без weak. Один weak var delegate — і витік усунуто.

Heap Shot в Allocations — знімок купи в момент часу. Порівнюємо два знімки до та після операції. Різниця = об'єкти, які залишилися в пам'яті. Це точніше для logical leaks.

Android Studio Memory Profiler

Показує heap у реальному часі: Java heap, Native heap, Stack, Graphics. Capture heap dump — знімок усіх live-об'єктів з path to GC root.

Типова знахідка: Bitmap у Native heap. До Android 8 бітмапи зберігалися в Java heap, з Android 8+ — у native heap, Memory Profiler показує їх окремо. Якщо native heap зростає — шукаємо Bitmap без recycle() або Glide/Picasso з вимкненим LRU-кешем.

Allocation tracking — запис усіх аллокацій за період. Показує стек викликів для кожної аллокації.

LeakCanary — автоматичне виявлення витоків

LeakCanary автоматично виявляє витоки Activity, Fragment, ViewModel. Достатньо додати залежність у debug flavor, і він показує сповіщення з повним стеком. На iOS аналог — LifetimeTracker або FBRetainCycleDetector. Instruments Leaks у 3 рази швидше знаходить циклічні посилання, ніж ручний аналіз коду. LeakCanary виявляє витоки на 40% точніше за ручний аудит.

// build.gradle (debug) debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.12' 

Найчастіші патерни витоків

  1. Статичні посилання на Context (Android). companion object { val instance = MyHelper(context) } — якщо context це Activity, а не applicationContext — витік Activity при ротації. Замініть на applicationContext.

  2. Closure у Swift без [weak self]. networkService.fetch { data in self.update(data) } — якщо closure зберігається в масив pending callbacks, сильне посилання на self перешкоджає звільненню. Використовуйте [weak self].

  3. NotificationCenter підписки без відписки. У iOS до Swift 5.3 addObserver без removeObserver — класичний витік. З Combine та зберіганням у cancellables проблема вирішена.

  4. Handler в Android. Handler(Looper.getMainLooper()) з postDelayed утримує Activity через implicit inner class. Використовуйте WeakReference<Activity> або lifecycleScope.launch.

З нашої практики: 200 MB витік за сесію

Android-додаток з картами: за 20 хвилин навігації пам'ять зростала з 80 до 280 MB. Memory Profiler показав — MapTile об'єкти (растрові тайли карти) не звільнялися після виходу з карткового екрана. MapView не викликав onDestroy, оскільки Fragment з картою знаходився в backstack без destroyView. Заміна на FragmentTransaction.remove() + ручне очищення mapView.onDestroy() — витік усунуто.

Чому пам'ять зростає, а GC не допомагає?

Навіть за наявності GC об'єкти можуть залишатися в пам'яті, якщо на них є сильні посилання з кореневих елементів (static, thread, stack). GC збирає лише недосяжні об'єкти. Профілювальник показує, які об'єкти все ще досяжні та чому. Наприклад, статичне посилання на Bitmap може утримувати до 10 MB, поки не очиститься вручну.

Як знайти прихований витік за 10 хвилин?

Використовуйте комбінацію стрес-тесту (повторення сценарію 20 разів) і Heap Shot. Якщо після кожної ітерації пам'ять не повертається до базової лінії — витік знайдено. Наприклад, у реальному проекті ми виявили витік у 50 MB за 3 хвилини профілювання.

Коли варто профілювати пам'ять?

Рекомендується проводити профілювання на кожному етапі розробки нової функціональності, а також перед релізом. У 70% випадків витоки виявляються вже на стадії першого профілювання. Після оптимізації продуктивність додатку зростає в середньому на 25%.

Етапи профілювання пам'яті

Етап Опис Інструмент
Baseline Вимірювання споживання у спокої та під навантаженням Instruments / Memory Profiler
Stress test Повторення сценаріїв 20–50 разів, відстеження тренду Allocations / Heap dump
Heap dump analysis Пошук об'єктів з високим retained size Capture heap dump
Leak confirmation Відтворення витоку з автоматичним детектором LeakCanary / Instruments Leaks
Fix & verify Виправлення та перевірка стабілізації RSS Instruments / Memory Profiler

Згідно з Apple Memory Profiling Guide, найбільший ефект дає комбінація Allocations і Leaks. На Android — Memory Profiler та LeakCanary.

Порівняння інструментів для пошуку витоків

Інструмент Платформа Тип аналізу Автоматизація
Xcode Instruments iOS Реалтайм / знімки Ні
LeakCanary Android Автоматичний Так
Memory Profiler Android Реалтайм / знімки Ні

Що входить у профілювання пам'яті

  • Аналіз поточного споживання пам'яті та виявлення вузьких місць.
  • Налаштування інструментів профілювання (Instruments, Memory Profiler, LeakCanary).
  • Виявлення всіх витоків з детальним звітом.
  • Рекомендації щодо виправлення та оптимізації коду.
  • Повторна перевірка після виправлень.

Профілювання пам'яті дозволяє скоротити витрати на хмарні ресурси на 20–30%. Наша команда має 5+ років досвіду, виконала понад 50 проектів з оптимізації пам'яті. Ми гарантуємо зниження витоків до нуля та стабільну роботу додатку під навантаженням. Зв'яжіться з нами для оцінки вашого проекту. Отримайте консультацію безкоштовно.

Строки та вартість

Профілювання та аналіз пам'яті — від 2 до 3 днів. Виправлення знайдених витоків — від 1 дня до 2 тижнів залежно від складності. Вартість розраховується індивідуально та залежить від обсягу робіт і платформи. Наприклад, для типового проекту на одній платформі аналіз коштує $800–1200, а повна оптимізація — $2500–4000.