Garbage Collectors (G1, ZGC)

Тема дорожной карты · Java

Java Garbage Collection (GC) — это подсистема автоматического управления памятью JVM, освобождающая память кучи, занятую объектами, которые больше недостижимы ни из одной живой ссылки, избавляя разработчиков от ручного malloc/free при условии понимания поведения GC для предотвращения всплесков задержки и OutOfMemoryError. Куча JVM разделена на поколения: Young (Eden + две области Survivor) содержит вновь выделенные короткоживущие объекты и собирается часто малыми GC с очень низкими паузами; Old (Tenured) содержит долгоживущие объекты, продвинутые из Young, и собирается реже крупными GC, которые могут вызывать более длительные STW (stop-the-world) паузы. Java поставляется с несколькими алгоритмами GC, выбираемыми через флаги JVM: Serial GC (-XX:+UseSerialGC) для однопоточных встраиваемых применений, Parallel GC (-XX:+UseParallelGC) для пакетных нагрузок с оптимизацией пропускной способности, G1 GC (-XX:+UseG1GC, по умолчанию с Java 9), делящий кучу на равные регионы и собирающий их в порядке приоритета для достижения целевого времени паузы, и ZGC (-XX:+UseZGC, полностью готовый к эксплуатации в Java 15+), выполняющий всю тяжёлую работу конкурентно с потоками приложения для достижения пауз менее миллисекунды даже на кучах в несколько терабайт. JIT-компилятор и GC работают совместно: анализ выхода JIT может определить, что объект никогда не покидает область видимости метода, и выделить его в стеке вместо кучи, полностью устраняя давление на GC. Настройка Java Garbage Collection включает установку размера кучи (-Xms, -Xmx), целей пауз GC (-XX:MaxGCPauseMillis) и анализ журналов GC с помощью GCViewer или встроенного вывода JVM -Xlog:gc* для корреляции событий GC с задержкой приложения, наблюдаемой при профилировании.

Как это работает

Garbage Collectors (G1, ZGC) покрывает class loading (Bootstrap, Platform, Application classloaders), байткод (JIT-компилируется HotSpot C1/C2 или AOT через GraalVM), GC (G1 — дефолт 9+; ZGC + Shenandoah — low-pause; Parallel — throughput), memory areas (heap, metaspace, stack, native), JFR (Java Flight Recorder) — production-профайлинг, jstack/jmap/jstat — CLI-тулзы.

Когда применять

Тюньте heap (-Xms = -Xmx для предсказуемой аллокации; размер = ~60-80% доступной RAM в контейнере). G1 GC — кроме нужды в очень низких паузах (тогда ZGC или Shenandoah). Гоняйте JFR непрерывно в production с низким overhead — бесценно, когда что-то идёт не так. jcmd — для взаимодействия с живой JVM. Читайте GC-логи (-Xlog:gc*:file=gc.log).

Типичные ошибки

Ловушки Garbage Collectors (G1, ZGC): дефолтный -Xmx 256MB или 25% RAM хоста (часто мал — задавайте явно); выбор CMS GC (deprecated, удалён); игнор native-памяти (off-heap buffers, JNI) когда total memory > heap; запуск профайлера без warmup (JIT-warmup искажает цифры).

Связанные понятия

Полезные ресурсы