Как работает Garbage Collector (сборщик мусора) в Java и какие основные типы сборщиков существуют?

Ответ

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

Принцип работы и поколения Heap: Память кучи (Heap) разделена на поколения, исходя из гипотезы о времени жизни объектов:

  1. Young Generation: Сюда помещаются новые объекты.
    • Eden: Объекты создаются здесь.
    • Survivor Spaces (S0, S1): Сюда перемещаются объекты, пережившие Minor GC.
  2. Old Generation (Tenured): Сюда перемещаются объекты, которые пережили несколько сборок в Young Generation (долгоживущие объекты).
  3. Metaspace (ранее PermGen): Хранит метаданные классов.

Типы сборок:

  • Minor GC: Быстрая сборка, очищающая только Young Generation.
  • Major/Full GC: Сборка мусора во всей куче (Young + Old), обычно более длительная, вызывающая паузы (STW - Stop-The-World).

Основные алгоритмы/сборщики:

  • Serial GC: Однопоточный, для приложений с маленькой кучей.
  • Parallel GC (Throughput Collector): Многопоточный для Minor и Major GC, оптимизирован для пропускной способности.
  • CMS (Concurrent Mark-Sweep): Старался минимизировать паузы, выполняя часть работы конкурентно с приложением. Устарел (deprecated).
  • G1 GC (Garbage-First): Современный сборщик по умолчанию для больших куч. Делит кучу на регионы и собирает те, где больше всего мусора.
  • ZGC / Shenandoah: Сборщики следующего поколения, цель — паузы менее 10 мс даже для терабайтных куч.

Настройка и мониторинг (примеры флагов JVM):

# Включение G1 GC (дефолтный с Java 9+)
-XX:+UseG1GC

# Установка размеров кучи
-Xms512m -Xmx2g

# Логирование работы GC
-XX:+PrintGCDetails -Xlog:gc*:file=gc.log

# Целевая максимальная пауза для G1
-XX:MaxGCPauseMillis=200

Важные практики:

  • Избегайте утечек памяти (например, static коллекции, растущие без очистки, или listeners без отписки).
  • Минимизируйте создание ненужных объектов в горячих циклах.
  • Не вызывайте System.gc() в production-коде — это лишь рекомендация для JVM, которая может нарушить работу выбранного алгоритма GC.

Ответ 18+ 🔞

А, ну вот, подъехали к самому интересному — к мусорщику, то бишь Garbage Collector'у! Это, блядь, такой хитрый дворник внутри JVM, который бегает за тобой и подбирает все объекты, которые ты набросал и забыл. Нет на них ссылок — считай, труп. А наш GC — санитар леса, ёпта!

Как этот цирк устроен, или почему куча — как многоэтажка для объектов

Представь, что память (Heap) — это общага. И живут там объекты по принципу «молодёжь отдельно, старики отдельно», блядь!

  1. Young Generation (Молодёжное отделение): Сюда всех новеньких селят. Ещё пахнут свежим new.

    • Eden (Эдем): Тут объекты рождаются. Всё прекрасно, пока место есть. Кончилось — началось!
    • Survivor Spaces (Выживальники S0 и S1): Те, кто пережил первую чистку (Minor GC), переезжают сюда. Как в игре «выживший» — перебегают из одного бункера в другой после каждой уборки. Крепчают, блядь.
  2. Old Generation (Пенсионный фонд): Если объект в молодёжке столько раз пережил сборки, что уже бороду отрастил — его переводят сюда. Долгожитель, сука. Убираются здесь реже, но метко.

  3. Metaspace (Библиотека): Тут не объекты, а инструкции по их сборке — метаданные классов. Раньше была PermGen, все её боялись, а теперь Metaspace — и в ажуре.

Какие бывают уборки, или когда дворник лютует

  • Minor GC: Быстрая, юная, резкая. Прибежал, навёл порядок в молодёжном отделе (Eden + Survivor) и свалил. Часто, но обычно не больно.
  • Major / Full GC: Это уже генеральная, ёпта! Останавливает весь мир (STW — Stop-The-World), идёт по всем этажам общаги — и по молодым, и по старым. Может надолго всё заморозить. Когда это случается часто — это пиздец и повод для паники.

Бригады дворников (алгоритмы сборки)

Раньше был один мужик с метлой, теперь — целые профсоюзы:

  • Serial GC: Одинокий дворник-пенсионер. Работает медленно, в один поток. Для дачных участков (маленьких куч) сгодится.
  • Parallel GC (Throughput Collector): Целая бригада гастарбайтеров. Много потоков, месят всё и сразу. Хотят вывезти как можно больше мусора за раз (максимальная пропускная способность). Паузы могут быть длинными, но мощными.
  • CMS (Concurrent Mark-Sweep): Хитрый интеллигентный дворник, который пытался подметать, пока ты ходишь. Хотел паузы свести к минимуму. Но, блядь, слишком сложный оказался, замучился и его списали (deprecated). Покойся с миром.
  • G1 GC (Garbage-First): Нынче модный и дефолтный чувак. Он не смотрит на поколения, а делит общагу на районы (регионы). Идёт и смотрит: «Ага, тут в этом районе мусора — овердохуища! Его чистим в первую очередь». Умный, блядь.
  • ZGC / Shenandoah: Это уже дворники из будущего, с лазерами и реактивными ранцами. Обещают, что мир будет замирать меньше чем на 10 миллисекунд, даже если мусора — целая гора. Магия, ёпта!

Как этим хозяйством рулить (примеры флагов)

# Включить модного дворника G1 (он и так по умолчанию с Java 9, но мало ли)
-XX:+UseG1GC

# Выделить общаге площадь: от 512 мегов сразу и до 2 гигов максимум
-Xms512m -Xmx2g

# Заставить дворника отчитываться о каждом чихе (логирование)
-XX:+PrintGCDetails -Xlog:gc*:file=gc.log

# Приказать G1: «Слушай сюда, больше чем на 200 миллисекунд мир не останавливай!»
-XX:MaxGCPauseMillis=200

Жизненные советы, чтобы не довести дворника до белого каления

  • Не устраивай утечки памяти! Это как если ты в static-комнату начнёшь тащить всякий хлам (объекты) и никогда его не выносить. Или подписался на события (listeners) и забыл отписаться. Дворник не может убрать то, на что, как ему кажется, ещё есть ссылка. Общага превратится в помойку — OutOfMemoryError, пиздец и перезагрузка.
  • Не плоди сущности без нужды. Особенно в циклах, которые крутятся миллионы раз. Каждый новый объект — работа для GC. Положил, тут же выбросил — заебёшь дворника по-чёрному.
  • Самое главное — НЕ ВЫЗЫВАЙ System.gc() в продакшене! Это не приказ, а робкая рекомендация JVM. Типа: «Дворник, может, подметёшь?» А у него свой график, свои алгоритмы. Ты его этим вызовом только собьёшь с толку, он может устроить внеплановую генеральную уборку (Full GC) посреди рабочего дня. Доверяй системе, блядь! Она умнее.