Sobes.tech
Junior
134
questionbank

Что такое сборка мусора в Java?

AI答案

sobes.tech AI

Автоматический процесс управления памятью, который удаляет неиспользуемые объекты из кучи (heap), освобождая занимаемое ими пространство. Garbage Collector (GC) определяет, какие объекты доступны (referenceable) из работающих частей программы, а какие — нет (unreachable), и удаляет последние.

Основные этапы:

  1. Marking (Пометка): GC определяет, какие объекты живы ( reachable) начиная с корней (например, локальные переменные активных потоков, статические переменные).
  2. Sweeping (Очистка): GC проходит по куче и удаляет все объекты, не помеченные как живые.
  3. 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 будут удерживаться.
    }
}