Ответ
Утечка памяти (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