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 повышает производительность:
-
В одной конфигурации бенчмарк SPECjbb2015 использует на 22% меньше памяти кучи и на 8% меньше процессорного времени.
-
В другой конфигурации число сборок мусора, выполняемых в SPECjbb2015, сокращается на 15% как со сборщиком мусора G1, так и с Parallel.
-
Бенчмарк высокопараллельного парсера JSON выполняется на 10% быстрее.
Пришло время сделать 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.