JEP 377: ZGC: A Scalable Low-Latency Garbage Collector (Production)
ZGC: масштабируемый сборщик мусора с низкими задержками (штатная возможность)
| Ответственный | Per Liden |
| Тип | Feature |
| Область | Implementation |
| Статус | Closed / Delivered |
| Выпуск | 15 |
| Компонент | hotspot / gc |
| Обсуждение | hotspot dash gc dash dev at openjdk dot java dot net |
| Связан с | JEP 351: ZGC: Uncommit Unused Memory (Experimental) |
| JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental) | |
| JEP 364: ZGC on macOS (Experimental) | |
| JEP 365: ZGC on Windows (Experimental) | |
| JEP 439: Generational ZGC | |
| Рецензенты | Erik Österlund, Mikael Vidstedt, Stefan Karlsson |
| Одобрен | Mikael Vidstedt |
| Создан | 2018/08/20 06:16 |
| Обновлён | 2026/07/14 10:18 |
| Задача | 8209683 |
Аннотация
Перевести Z Garbage Collector из статуса Experimental (экспериментальная функция) в штатные возможности.
Что не является целью
Этот JEP не предлагает менять сборщик мусора по умолчанию: им остаётся G1.
Мотивация
ZGC был интегрирован в JDK 11 в рамках JEP 333. Новые возможности такого размера и сложности лучше вводить осторожно и постепенно, поэтому мы выпустили его в статусе Experimental. Это помогло сформировать ожидания пользователей и позволило им присылать отзывы без необходимости скачивать или собирать отдельные бинарные файлы JDK. Так пришлось бы делать, если бы разработка ZGC продолжалась вне JDK.
С момента появления в JDK 11 мы получили положительные отзывы, исправили много ошибок и добавили ряд возможностей и улучшений. Вот некоторые из наиболее важных:
- Конкурентная выгрузка классов
- Освобождение (uncommit) неиспользуемой памяти (JEP 351)
- Максимальный размер кучи увеличен с 4 ТБ до 16 ТБ
- Минимальный размер кучи уменьшен до 8 МБ
-XX:SoftMaxHeapSize- Поддержка профилировщика утечек JFR
- Поддержка class-data sharing (совместного использования данных классов)
- Ограниченные и несмежные адресные пространства
- Поддержка размещения кучи в NVRAM
- Улучшенный учёт NUMA
- Многопоточное предварительное касание (pre-touch) страниц кучи
Кроме того, теперь поддерживаются все широко используемые платформы:
Тестирование ZGC показывает, что он стабилен, и на момент написания этого текста мы уже несколько месяцев не получали новых сообщений об ошибках, специфичных для ZGC. Учитывая стабильность, набор возможностей и поддержку платформ, которые есть у ZGC сегодня, пора снять с него статус Experimental и сделать его штатной возможностью.
Описание
Сейчас ZGC включается параметрами командной строки -XX:+UnlockExperimentalVMOptions -XX:+UseZGC. Если ZGC станет штатной возможностью (не Experimental), параметр -XX:+UnlockExperimentalVMOptions больше не понадобится.
Перевод ZGC в штатные возможности (не Experimental) в основном сводится к изменению типа параметра командной строки UseZGC с experimental на product. Кроме того, мы также изменим на product следующие параметры, специфичные для ZGC, которые сейчас помечены как experimental. Значения этих параметров по умолчанию мы менять не будем.
ZAllocationSpikeTolerance
ZCollectionInterval
ZFragmentationLimit
ZMarkStackSpaceLimit
ZProactive
ZUncommit
ZUncommitDelay
Следующие события JFR, специфичные для ZGC, которые сейчас помечены как experimental, также будут изменены на product.
ZAllocationStall
ZPageAllocation
ZPageCacheFlush
ZRelocationSet
ZRelocationSetGroup
ZUncommit
Тестирование
Тесты ZGC были добавлены в рамках JEP 333, и с тех пор появились дополнительные тесты. В рамках этого JEP новые тесты разрабатываться не будут.
Некоторые тесты сейчас передают параметр командной строки -XX:+UnlockExperimentalVMOptions при включении ZGC. Это больше не понадобится, и эти тесты будут соответствующим образом изменены.