Назад к вопросам
Middle+
176
questionbank

Как в проекте можно выявить утечки памяти?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Для выявления утечек памяти в Android-проекте используются следующие основные инструменты и методы:

  1. Android Studio Profiler. Встроенный инструмент для мониторинга использования памяти, ЦП, сети и энергии. Позволяет посмотреть график использования памяти в реальном времени и сделать дамп кучи (heap dump).

  2. Heap Dump Analysis. Анализ дампа кучи (.hprof файл) позволяет увидеть, какие объекты занимают больше всего памяти и есть ли объекты, которые должны быть освобождены сборщиком мусора, но на них остались сильные ссылки.

  3. Memory Snapshot Comparison. Сравнение двух дампов кучи, снятых в разное время, помогает выявить объекты, количество которых аномально растет, что может указывать на утечку.

  4. LeakCanary. Популярная сторонняя библиотека, которая автоматически обнаруживает утечки памяти в отладочных сборках приложения и отображает их в виде уведомлений. Значительно упрощает поиск утечек.

    Добавление зависимости в build.gradle:

    dependencies {
        // debugImplementation - утечки проверяются только в отладочных сборках
        debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.12'
    }
    
  5. StrictMode. Режим разработчика, который помогает выявлять операции, выполняемые в основном потоке (например, чтение с диска или сетевые запросы), а также утечки объектов (например, Activity, Service).

    Пример использования StrictMode для обнаружения утечек Activity:

    if (BuildConfig.DEBUG) {
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                .detectLeakedClosableObjects() // Обнаружение утечек Closeable
                .detectLeakedRegistrationObjects() // Обнаружение утечек объектов, регистрируемых в listeners
                .detectActivityLeaks()           // Обнаружение утечек Activity
                .penaltyLog()                  // Выводить нарушения в лог
                .build());
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                .detectDiskReads()             // Обнаружение чтения с диска в основном потоке
                .detectDiskWrites()            // Обнаружение записи на диск в основном потоке
                .detectNetwork()               // Обнаружение сетевых запросов в основном потоке
                .penaltyLog()                  // Выводить нарушения в лог
                .build());
    }
    
  6. Анализ кода. Ручной анализ кода, особенно в местах, где используются контексты, слушатели (listeners), асинхронные задачи или статические переменные, которые могут хранить ссылки на объекты, срок жизни которых должен быть короче.

  7. Тесты. Написание unit- и instrumentation тестов, которые могут воспроизводить сценарии, потенциально вызывающие утечки, и проверять наличие утечек программно.

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