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

JEP 534: Compact Object Headers by Default

Compact Object Headers (компактные заголовки объектов) по умолчанию

ОтветственныйRoman Kennke
ТипFeature
ОбластьJDK
СтатусClosed / Delivered
Выпуск27
Компонентhotspot / runtime
Обсуждениеhotspot dash runtime dash dev at openjdk dot org
ТрудоёмкостьXS
ДлительностьXS
Связан сJEP 519: Compact Object Headers
РецензентыVladimir Kozlov
ОдобренVladimir Kozlov
Создан2025/07/01 13:36
Обновлён2026/08/11 18:41
Задача8361187

Аннотация

Сделать Compact Object Headers форматом заголовка объекта по умолчанию в HotSpot JVM. Compact Object Headers уменьшают заголовки объектов с 96 до 64 бит на 64-битных архитектурах. Так уменьшается размер кучи, повышается плотность развёртывания и улучшается локальность данных.

Что не является целью

  • Удалять прежний 96-битный формат заголовка объекта сейчас не входит в цели.

Мотивация

Compact Object Headers появились как альтернативный формат заголовка объекта в JEP 450 (JDK 24) и стали полноценной штатной возможностью в JEP 519 (JDK 25). Возможности такого масштаба лучше вводить осторожно и постепенно, поэтому мы пока не включили её по умолчанию.

С JDK 24 режим Compact Object Headers доказал свою стабильность и производительность.

В Oracle его протестировали, прогнав полный набор тестов JDK. Его также тестировали в Amazon и SAP. В Amazon сотни сервисов работают в продакшене с Compact Object Headers, большинство из них использует бэкпорты этой возможности в JDK 21 и JDK 17. SAP уже включила Compact Object Headers по умолчанию в своём производном форке OpenJDK — SapMachine; там ежедневно прогоняют большой набор тестов, и у этого дистрибутива большая база клиентов.

Различные эксперименты показывают, что включение Compact Object Headers повышает производительность:

Пришло время сделать Compact Object Headers режимом по умолчанию. В одном из будущих выпусков мы намерены перевести прежний формат заголовка объекта в статус Deprecated (устаревший).

Описание

В JDK 25 режим Compact Object Headers включается параметром командной строки

$ java -XX:+UseCompactObjectHeaders ...

Когда Compact Object Headers станут режимом по умолчанию, этот параметр больше не понадобится. При необходимости эту возможность можно отключить, запустив JVM с параметром:

$ java -XX:-UseCompactObjectHeaders ...

Тестирование

Режим Compact Object Headers прошёл масштабное тестирование в рамках JEP 450 и JEP 519. Перед интеграцией этого изменения будет проведён ещё один полный цикл тестирования корректности и производительности.

Риски и допущения

Как говорилось в JEP 450, будущим возможностям может понадобиться больше битов в заголовке объекта. Мы уже зарезервировали четыре бита для проекта Valhalla. Если понадобится ещё больше битов, мы можем ещё сильнее сократить сжатые указатели на классы и хэш-коды Identity (идентичность объекта). Для этого есть приёмы, прототипы которых уже созданы в проекте Lilliput.