Что такое утечка памяти в Java

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

Ответ

Утечка памяти (memory leak) в Java — это ситуация, когда объекты больше не используются приложением, но не могут быть собраны сборщиком мусора (GC) из-за сохраненных ссылок на них.

Основные причины:

  • Статические поля (живут пока жив класс)
  • Неотписанные слушатели (например, OnClickListener)
  • Незакрытые ресурсы (Cursor, InputStream)
  • Внутренние классы, хранящие ссылку на внешний (Handler в Activity)

Пример утечки:

public class LeakyActivity extends Activity {
    private static Context sContext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        sContext = this; // Утечка! Activity не сможет быть собрана GC
    }
}

Как избежать:

  • Используйте WeakReference для ссылок на контекст
  • Всегда отписывайтесь от событий в onDestroy()
  • Используйте try-with-resources для AutoCloseable объектов
  • Для Handler используйте статический внутренний класс + WeakReference