GC - специальный механизм созданный в java для удаления мусора
GC проверяет каждый объект на доступность в JVM heap, и удаляет неиспользуемые
У GC есть два шага:
- Mark: маркирует области памяти которые не используются
- Sweep: удаляет объекты после фазы mark
Преимущества:
- не нужно руками алоцировать и очищать память
- никаких висячих указателях
- автоматическое управление утечками памяти
Недостатки:
- для работы GC требуется дополнительные ресурсы процессора
- у программы нет контроля над очищаемыми объектами
- некоторые реализации GC могут непредсказуемо останавливать программу
- автоматическая сборка мусора может быть не такой эффективной как ручная алокация / очищение (с этим не согласен)
Информация взята отсюда: https://www.baeldung.com/jvm-garbage-collectors Дополнительная информация: https://developers.redhat.com/articles/2021/11/02/how-choose-best-java-garbage-collector#choosing_a_garbage_collector Развитие GC от 8 до 17 java: https://kstefanj.github.io/2021/11/24/gc-progress-8-17.html
Serial Garbage Collector
Запуск программы:
java -XX:+UseSerialGC -jar Application.javaПростая реализация, обычно работает с однопоточном режиме. В результате этот GC тормозит все потоки приложения когда запускается. Если приложению не требуются короткие паузы или если это клиентское приложение, то данный GC подходит идеально.
Parallel Garbage Collector
GC по умолчанию
Запуск программы:
java -XX:+UseParallelGC -jar Application.javaРаботает с несколькими потоками для обработки хипа, но так же может тормозить некоторые потоки приложения во время работы. Можно настроить максимальное количество потоков и время пауз:
-XX:ParallelGCThreads=<N>
Опция задает максимальное количество потоков
-XX:MaxGCPauseMillis=<N>
Максимальная пауза, зазор (в милисекундах) между двумя вызовами GC
-XX:GCTimeRatio=<N>
Время затрачиваемое GC против времени вне работы GC (maximum throughput target)
Данный параметр определяет это соотношение, вычисляет как 1 / (1 + N)
Например, если -XX:GCTimeRatio=19 то выполнение GC будет 5%, а выполнение программы будет 95% Таким образом приложение будет работать в 19 раз дольше чем GC
CMS Garbage Collector
Deprecated в 9 версии java, удален в 14 версии java (больше не поддерживается)
Запуск программы:
java -XX:+UseParNewGC -jar Application.javaConcurrent Mark Sweep (CMS), разработан для программ которым нужны короткие паузы, может использовать ресурсы процессора совместно с GC. Приложение с таким GC в среднем будет отвечать медленнее, но не должно переставать отвечать вообще (не должно быть пауз)
G1 Garbage Collector
Должен заменить CMS, доступен с 7 версии java
Запуск программы:
java -XX:+UseG1GC -jar Application.javaСоздан для многопроцессорных машин, с большим количеством памяти.
GC разделяет весь хип на несколько регионов. GC запускает глобальный шаг Mark для всех регионов.
После завершения разметки, GC будет знать какие регионы мало заполнены. Данные регионы очищаются первыми,
что позволяет освободить большое количество свободного места сразу.
Именно поэтому метод назван Garbage-First
Z Garbage Collector
Добавлен в 11 версии для линукса, и в 14 версии для винды и макос
В 15 версии java перестал быть экспериментальной функцией
Запуск программы:
# до java 15:
java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC Application.java
# начиная с java 15:
java -XX:+UseZGC Application.javaПредставлен как расширяемый сборщик мусора с низкими задержками. Выполняет всю работу конкурентно, без задержек выполнения программы более чем на 10 мсек. Использует барьеры (load barriers with colored pointers) для выполнения конкурентных операций на работающих потоках.
Цветные ссылки (colored pointers) - это основной концепт работы данного GC. Сборщик использует дополнительный бит ссылок для маркировки состояния на объектов. Работает с хипами от 8мб до 16Тб, причем паузы не увеличиваются с увеличением размера хипа.
Shenandoah collector
Доступен с 17 версии java (хотя появился гораздо раньше)
Запуск программы:
java -XX:+UseShenandoahGC Application.javaСборщик мусора с очень короткими паузами. Снижение пауз реализовано через конкурентную работу, включая компановку (concurrent compaction). Паузы не зависят от размера хипа, поведение сборщика должно быть одинаковым для 2Гб или 200Гб хипа.
Дополнительная информация: https://developers.redhat.com/articles/2021/09/16/shenandoah-openjdk-17-sub-millisecond-gc-pauses