Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Java: Garbage Collector, GC, Java 17, JVM, G1GC

Какой GC используется по умолчанию в Java 17?

Этот вопрос проверяет знание сборщиков мусора в современных версиях Java, что важно для понимания производительности приложений и выбора JVM.

Короткий ответ

Начиная с Java 9 и по умолчанию в Java 17, используется сборщик мусора G1 (Garbage-First). Он был выбран как баланс между низкими паузами и высокой пропускной способностью для большинства рабочих нагрузок. G1 делит кучу на регионы и собирает мусор в несколько фаз, стараясь минимизировать время остановки приложения. Это универсальный GC, подходящий для серверных приложений с большими кучами.

Длинный ответ

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

Эволюция сборщиков по умолчанию

Исторически в Java использовались разные GC. В ранних версиях (до Java 9) по умолчанию часто был Parallel GC (Throughput Collector). С Java 9 и во всех последующих LTS-релизах, включая Java 11, Java 17 и Java 21, сборщиком по умолчанию является G1 (Garbage-First). Это решение было принято потому, что G1 предлагает более предсказуемые паузы по сравнению с Parallel GC, оставаясь при этом достаточно производительным для широкого спектра задач.

Как работает G1 GC

G1 делит кучу (heap) на множество регионов примерно одинакового размера. Он работает в несколько фаз:

  • Молодая сборка (Young Collection): Происходит часто и собирает короткоживущие объекты из Eden и Survivor регионов.
  • Смешанная сборка (Mixed Collection): Помимо молодого поколения, G1 также выбирает для очистки некоторые регионы старшего поколения (Old Generation), которые содержат больше всего мусора (отсюда и название "Garbage-First").
  • Фаза прохода (Concurrent Marking Cycle): Выполняется параллельно с работой приложения для определения живых объектов в старом поколении.

Ключевая цель G1 — уложиться в заданное целевое время паузы (по умолчанию 200 мс), что делает его подходящим для приложений, чувствительных к задержкам.

Пример настройки и проверки

Узнать, какой GC используется, можно через аргументы командной строки или вывод JVM.

// Запуск приложения с явным указанием GC (хотя это и по умолчанию)
java -XX:+UseG1GC -jar myapp.jar

// Проверка используемого GC в runtime (пример кода на Java)
import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;

public class CheckGC {
    public static void main(String[] args) {
        for (GarbageCollectorMXBean gcBean : ManagementFactory.getGarbageCollectorMXBeans()) {
            System.out.println("GC Name: " + gcBean.getName());
            // Для G1 вы увидите имена, содержащие "G1"
        }
    }
}

Когда использовать G1 и альтернативы

G1 — отличный выбор по умолчанию для большинства серверных приложений. Однако, если ваше приложение имеет особые требования, можно рассмотреть другие сборщики:

  • ZGC / Shenandoah: Для экстремально низких пауз (менее 10 мс) в приложениях с очень большими кучами (несколько терабайт). Доступны с Java 11/15 как экспериментальные, а в последних версиях — как production-ready.
  • Parallel GC: Если основная цель — максимальная пропускная способность (throughput), а не низкие паузы, и приложение может терпеть более длительные остановки.
  • Serial GC: Для простых клиентских приложений или окружений с крайне ограниченными ресурсами.

Вывод: G1 GC используется по умолчанию в Java 17 как сбалансированное решение, обеспечивающее предсказуемые паузы сборки мусора. Его стоит применять для большинства production-серверов. Переходить на ZGC или Shenandoah следует, когда требования к паузам становятся критически жесткими, а на Parallel GC — когда приоритетом является исключительно общая производительность, а не latency.

Уровень

  • Рейтинг:

    3

  • Сложность:

    5

Навыки

  • Java

    Java

Ключевые слова

#Garbage Collector

#GC

#Java 17

#JVM

#G1GC

Подпишись на Java Developer в телеграм