JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
Shenandoah: сборщик мусора с короткими паузами, статус Experimental (экспериментальная функция)
| Authors | Christine H. Flood, Roman Kennke |
| Ответственный | Roman Kennke |
| Тип | Feature |
| Область | Implementation |
| Статус | Closed / Delivered |
| Выпуск | 12 |
| Компонент | hotspot / gc |
| Обсуждение | hotspot dash gc dash dev at openjdk dot java dot net |
| Трудоёмкость | L |
| Длительность | L |
| Рецензенты | Aleksey Shipilev, Andrew Dinn, Erik Österlund |
| Одобрен | Vladimir Kozlov |
| Создан | 2014/01/02 20:00 |
| Обновлён | 2021/08/28 00:15 |
| Задача | 8046179 |
Аннотация
Добавить новый алгоритм сборки мусора (GC) под названием Shenandoah, который сокращает время пауз GC за счёт того, что эвакуация выполняется одновременно с работающими потоками Java. Время пауз с Shenandoah не зависит от размера кучи: паузы будут одинаково стабильными, будь у вас куча 200 МБ или 200 ГБ.
Что не является целью
Это не единый GC на все случаи жизни. Есть другие алгоритмы сборки мусора, для которых пропускная способность или объём занимаемой памяти важнее отзывчивости. Shenandoah подходит для приложений, которым важны отзывчивость и предсказуемо короткие паузы. Цель не в том, чтобы устранить все проблемы с паузами JVM. Паузы, вызванные не GC, а другими причинами, например проблемами Time To Safe Point (TTSP) или раздуванием мониторов (monitor inflation), выходят за рамки этого JEP.
Критерии успеха
Проект будет успешным, если нам удастся поддерживать стабильно короткое время пауз gc.
Описание
У современных машин больше памяти и больше процессоров, чем когда-либо прежде. Приложения с соглашением об уровне обслуживания (Service Level Agreement, SLA) гарантируют время отклика 10–500 мс. Чтобы достичь нижней границы этого диапазона, нам нужны алгоритмы сборки мусора, которые достаточно эффективны, чтобы программы работали в доступной памяти, и при этом оптимизированы так, чтобы никогда не прерывать работающую программу больше чем на несколько миллисекунд. Shenandoah — сборщик с открытым исходным кодом и малым временем пауз для OpenJDK, созданный, чтобы приблизить нас к этим целям.
Shenandoah расплачивается процессорным временем параллельной работы и памятью за сокращение времени пауз. Мы добавили к каждому объекту Java указатель перенаправления, благодаря которому потоки GC могут уплотнять кучу, пока работают потоки Java. Разметка и уплотнение выполняются параллельно с программой, поэтому потоки Java нужно приостанавливать лишь на время, достаточное для сканирования стеков потоков, чтобы найти и обновить корни графа объектов.
Алгоритм Shenandoah подробно описан в этой статье PPPJ2016.
Shenandoah реализован, и Red Hat будет поддерживать его для aarch64 и для amd64.
Текущая разработка Shenandoah ведётся в проекте OpenJDK Shenandoah. Подробнее о текущем процессе разработки, деталях реализации и доступности см. на вики-странице Shenandoah.
Альтернативы
У Zing/Azul есть сборщик без пауз, однако эта работа не была передана в OpenJDK.
В ZGC есть сборщик с короткими паузами, основанный на цветных указателях. Мы с нетерпением ждём возможности сравнить производительность двух подходов.
G1 выполняет часть работы параллельно и одновременно с программой, но не выполняет эвакуацию одновременно с программой.
CMS выполняет разметку одновременно с программой, но копирование молодого поколения выполняет во время пауз и никогда не уплотняет старое поколение. Из-за этого больше времени уходит на управление свободным пространством в старом поколении, а также возникают проблемы с фрагментацией.
Сборка и запуск
Поскольку Shenandoah имеет статус Experimental, для него потребуется -XX:+UnlockExperimentalVMOptions в командной строке. Система сборки Shenandoah автоматически отключает сборку на неподдерживаемых конфигурациях. Сборщики дистрибутивов могут отключить сборку Shenandoah с помощью --with-jvm-features=-shenandoahgc на платформах, которые в остальном поддерживаются.
Чтобы включить и использовать Shenandoah GC, потребуются следующие параметры JVM: -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC.
Подробнее о том, как настроить Shenandoah GC, см. на вики-странице Shenandoah.
Тестирование
Red Hat провела обширное тестирование на наших важных приложениях. Мы разработали много тестов jtreg, специфичных для Shenandoah. Shenandoah поставляется в Fedora начиная с Fedora 24 и как tech preview в Rhel 7.4. Запуска стандартных тестов OpenJDK с -XX:+UseShenandoahGC должно быть достаточно.
Риски и допущения
Интерфейс GC (JEP 304) был интегрирован в JDK 11, и с тех пор в него внесено много расширений и улучшений. Это сводит к минимуму риски добавления Shenanodah в исходный код OpenJDK. Кроме того, все специфичные для Shenandoah пути кода, которые нельзя разумно обработать иначе, будут защищены #ifdef INCLUDE_SHENANDOAHGC или аналогичными механизмами. Изначально Shenandoah GC получит статус Experimental, и поэтому для него потребуется -XX:+UnlockExperimentalVMOptions в дополнение к -XX:+UseShenandoahGC.