🧠 Продвинутая задача Java — Невидимая утечка памяти в лямбдах Задача: Предположим, вы пишете сервис, в котором создаются задачи (например, отложенные действия): public class TaskScheduler { private final List<Runnable> tasks = new ArrayList<>(); public void scheduleTask(String name) { String largeData = name.repeat(10_000); // имитируем большой объект tasks.add(() -> { System.out.println("Running task: " + name); }); } public void runAll() { tasks.forEach(Runnable::run); } } Теперь создайте 1_000_000 таких задач: TaskScheduler scheduler = new TaskScheduler(); for (int i = 0; i < 1_000_000; i++) { scheduler.scheduleTask("Task" + i); } Вопрос: Почему String largeData не освобождается сборщиком мусора, хотя он нигде явно не используется? Разбор: На первый взгляд, largeData нигде не используется — его можно было бы освободить. Но на самом деле лямбда-захват переменной name удерживает весь стек метода scheduleTask, включая largeData. Это называется неявная утечка памяти через з