Какие знаешь примеры утечки памяти в Android

«Какие знаешь примеры утечки памяти в Android» — вопрос из категории Управление памятью, который задают на 24% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

  1. Анонимные классы и внутренние классы – удерживают ссылку на внешний класс (Activity/Fragment).
    button.setOnClickListener(object : View.OnClickListener {  
        override fun onClick(v: View?) { /*...*/ }  
    })  
**Решение:** Используйте лямбды или слабые ссылки (`WeakReference`).
  1. Статические ссылки на контекст/View – живут дольше активити.
    companion object {  
        var context: Context? = null // Утечка!  
    }  
**Решение:** Используйте `ApplicationContext` или `WeakReference`.
  1. Неотменённые Rx-подписки, корутины – продолжают работать после уничтожения активити.
    lifecycleScope.launch { /* Долгая операция */ } // Утечка без `repeatOnLifecycle`.  
**Решение:** Отменяйте через `Disposable.clear()` или `lifecycleScope`.
  1. Синглтоны с контекстом – например, Retrofit с передачей Activity.
    Решение: Передавайте ApplicationContext.

  2. Регистрация BroadcastReceiver без отмены – удерживает активити в памяти.

    override fun onStart() {  
        registerReceiver(receiver, filter) // Утечка, если не unregisterReceiver.  
    }  

Инструменты для поиска: Android Profiler, LeakCanary.