Назад к вопросам
Junior
80
questionbank
Что такое сборка мусора в Java?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Автоматический процесс управления памятью, который удаляет неиспользуемые объекты из кучи (heap), освобождая занимаемое ими пространство. Garbage Collector (GC) определяет, какие объекты доступны (referenceable) из работающих частей программы, а какие — нет (unreachable), и удаляет последние.
Основные этапы:
- Marking (Пометка): GC определяет, какие объекты живы ( reachable) начиная с корней (например, локальные переменные активных потоков, статические переменные).
- Sweeping (Очистка): GC проходит по куче и удаляет все объекты, не помеченные как живые.
- Compacting (Компактизация, необязательно): Перемещает живые объекты, чтобы уменьшить фрагментацию памяти.
Достоинства:
- Упрощает разработку, избавляя от ручного управления памятью.
- Снижает риск утечек памяти (memory leaks) и ошибок доступа к освобожденной памяти (dangling pointers).
Недостатки:
- Могут возникать паузы в работе приложения (Stop-the-World events) во время сборки мусора.
- GC требует вычислительных ресурсов.
Различные алгоритмы сборки мусора (Serial GC, Parallel GC, CMS, G1, ZGC, Shenandoah) отличаются по производительности, задержкам и используемой памяти.
// Пример утечки памяти, где GC не сможет освободить объекты
import java.util.ArrayList;
import java.util.List;
public class MemoryLeakExample {
private List<Object> list = new ArrayList<>();
public void addObject(Object obj) {
list.add(obj); // Объекты добавляются в список и остаются доступными
}
public static void main(String[] args) {
MemoryLeakExample example = new MemoryLeakExample();
for (int i = 0; i < 1000000; i++) {
example.addObject(new Object()); // Каждый новый объект добавляется в список
}
// Список example.list удерживает ссылки на все созданные Object-ы,
// предотвращая их сборку мусора, даже если объект example
// перестанет быть доступным из main (в данном случае example живет до конца main).
// В более сложных сценариях, если instance класса MemoryLeakExample
// будет оставаться доступным из-за какой-либо внешней ссылки,
// то и все объекты в list будут удерживаться.
}
}