[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-jvm-kak-rabotaet-g1-garbage-collector":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":18,"progress":19,"seo":20},1214,"kak-rabotaet-g1-garbage-collector",38,"jvm","JVM","⚙️","Как работает G1 Garbage Collector","G1 (Garbage-First) — это сборщик мусора, ставший используемым по умолчанию с Java 9 (JEP 248). Его основная цель — обеспечить предсказуемые паузы при сохранении высокой пропускной способности.\n\n> Аналогия из жизни: представьте город, разделённый на районы. Вместо того чтобы убирать весь город сразу (что парализует движение), коммунальная служба выбирает самые замусоренные районы и убирает их в первую очередь. Отсюда название Garbage-First — мусор в первую очередь.\n\n### Регионы (Regions)\n\nG1 делит всю кучу на множество регионов одинакового размера (обычно 1-32 MB, автоматически подбирается так, чтобы было около 2048 регионов). Каждый регион может быть:\n\n| Тип региона | Назначение |\n|---|---|\n| Eden | Новые объекты |\n| Survivor | Объекты, пережившие Minor GC |\n| Old | Долгоживущие объекты |\n| Humongous | Объекты размером > 50% региона |\n\n```\n+---+---+---+---+---+---+---+---+---+---+\n| E | E | S |   | O | O | H | H |   | E |\n+---+---+---+---+---+---+---+---+---+---+\nE = Eden, S = Survivor, O = Old, H = Humongous, пусто = свободный\n```\n\n### Фазы работы G1\n\n1. Young-only Collection (Minor GC) — собирает только Eden и Survivor регионы. Живые объекты копируются в Survivor или Old. Stop-the-world, но обычно очень быстрая (\u003C 10 мс)\n\n2. Concurrent Marking (конкурентная разметка):\n   - Initial Mark (STW) — отмечает корневые объекты, совмещается с Young GC\n   - Concurrent Mark — обход графа объектов параллельно с приложением\n   - Remark (STW) — завершение разметки, обработка изменений (SATB)\n   - Cleanup (частично STW) — подсчёт живых объектов, выбор регионов для сборки\n\n3. Mixed Collection (смешанная сборка) — собирает и Young, и выбранные Old регионы с наибольшим количеством мусора\n\n\u003Cdetails>\n\u003Csummary>Ключевые параметры G1\u003C\u002Fsummary>\n\n```bash\n# Целевое время паузы (по умолчанию 200 мс)\n-XX:MaxGCPauseMillis=100\n\n# Размер региона (1-32 MB, степень двойки)\n-XX:G1HeapRegionSize=16m\n\n# Порог заполнения heap для запуска concurrent marking (по умолчанию 45%)\n-XX:InitiatingHeapOccupancyPercent=45\n\n# Включить дедупликацию строк\n-XX:+UseStringDeduplication\n\n# Количество потоков для параллельных фаз\n-XX:ParallelGCThreads=8\n\n# Количество потоков для конкурентных фаз\n-XX:ConcGCThreads=4\n```\n\n\u003C\u002Fdetails>\n\n### Humongous-объекты\n\nОбъекты, занимающие более 50% размера региона, считаются humongous. Они размещаются в специальных humongous-регионах и собираются только при concurrent marking или Full GC. Большое количество humongous-объектов негативно влияет на производительность.\n\n### String Deduplication\n\nG1 поддерживает дедупликацию строк (`-XX:+UseStringDeduplication`). Если несколько объектов `String` содержат одинаковый массив символов, G1 заставляет их использовать один и тот же `byte[]`, экономя память.\n\n### Частые ошибки\n\n- Установка слишком низкого `MaxGCPauseMillis` (\u003C 20 мс) — G1 будет слишком часто собирать мусор\n- Ручное задание размеров Young Generation (`-Xmn`) при использовании G1 — отключает адаптивное управление\n- Игнорирование humongous-аллокаций — они обходят стандартный механизм и могут вызывать внеочередные GC\n- Отсутствие GC-логов: `-Xlog:gc*:file=gc.log` — без них невозможно настроить G1\n\n> **На собеседовании:** объясните три ключевые идеи G1: деление кучи на регионы (вместо фиксированного Young\u002FOld), приоритет сборки самых замусоренных регионов, и целевое время паузы (`MaxGCPauseMillis`). Упомяните, что это цель, а не гарантия. Если спрашивают о Full GC — до Java 10 он был однопоточным, с Java 10+ стал многопоточным.","","middle",[7,15,16,17],"memory","performance","gc",[],null,{"title":21,"description":22,"ogTitle":21,"ogDescription":23,"keywords":24,"schemaAnswer":33,"featuredSnippetReady":34},"Как работает G1 Garbage Collector — Gymterview","G1 GC: регионы (Eden, Survivor, Old, Humongous), фазы работы (Young, Concurrent Marking, Mixed), ключевые параметры MaxGCPauseMillis, String Deduplication.","G1 GC: деление heap на регионы, фазы сборки (Young, Concurrent Marking, Mixed), настройка MaxGCPauseMillis, Humongous-объекты.",[25,26,27,28,29,30,31,8,32],"G1 GC","Garbage-First","регионы","Humongous","MaxGCPauseMillis","Mixed Collection","Concurrent Marking","собеседование","G1 (Garbage-First) — GC по умолчанию с Java 9. Делит heap на регионы (Eden, Survivor, Old, Humongous) по 1-32 MB. Три фазы: Young Collection (собирает Young регионы), Concurrent Marking (разметка живых объектов параллельно с приложением), Mixed Collection (Young + выбранные Old с максимумом мусора). MaxGCPauseMillis (200 мс) — целевое, не гарантированное время паузы.",true]