openjdk.ruOpenJDK на русском

JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)

Shenandoah: сборщик мусора с короткими паузами, статус Experimental (экспериментальная функция)

AuthorsChristine 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.