Ответ
Garbage Collector (GC) — это механизм автоматического управления памятью в JVM, который освобождает память, занятую объектами, ставшими недостижимыми (т.е. на которые больше нет ссылок из работающего кода).
Принцип работы и поколения Heap: Память кучи (Heap) разделена на поколения, исходя из гипотезы о времени жизни объектов:
- Young Generation: Сюда помещаются новые объекты.
- Eden: Объекты создаются здесь.
- Survivor Spaces (S0, S1): Сюда перемещаются объекты, пережившие Minor GC.
- Old Generation (Tenured): Сюда перемещаются объекты, которые пережили несколько сборок в Young Generation (долгоживущие объекты).
- 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) — это общага. И живут там объекты по принципу «молодёжь отдельно, старики отдельно», блядь!
-
Young Generation (Молодёжное отделение): Сюда всех новеньких селят. Ещё пахнут свежим
new.- Eden (Эдем): Тут объекты рождаются. Всё прекрасно, пока место есть. Кончилось — началось!
- Survivor Spaces (Выживальники S0 и S1): Те, кто пережил первую чистку (Minor GC), переезжают сюда. Как в игре «выживший» — перебегают из одного бункера в другой после каждой уборки. Крепчают, блядь.
-
Old Generation (Пенсионный фонд): Если объект в молодёжке столько раз пережил сборки, что уже бороду отрастил — его переводят сюда. Долгожитель, сука. Убираются здесь реже, но метко.
-
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) посреди рабочего дня. Доверяй системе, блядь! Она умнее.