Junior
134
questionbank
Что такое сборка мусора в Java?
AI答案
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 будут удерживаться.
}
}