Этот вопрос проверяет знание сборщиков мусора в современных версиях Java, что важно для понимания производительности приложений и выбора JVM.
В 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 делит кучу (heap) на множество регионов примерно одинакового размера. Он работает в несколько фаз:
Ключевая цель 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 GC используется по умолчанию в Java 17 как сбалансированное решение, обеспечивающее предсказуемые паузы сборки мусора. Его стоит применять для большинства production-серверов. Переходить на ZGC или Shenandoah следует, когда требования к паузам становятся критически жесткими, а на Parallel GC — когда приоритетом является исключительно общая производительность, а не latency.