Команда Spring АйО представляет одну немаловажную фичу Java 25: компактные заголовки объектов (Compact Object Headers). Это позволит JVM экономить память и ускоряться без вмешательства в код.
Что это такое?
У каждого объекта в Java есть заголовок — служебные данные, которые JVM использует для синхронизации, GC и т.д. Обычно заголовок занимает 96 бит (12 байт) на 64-битных платформах.
С JEP 450 в Java 24 появится экспериментальная опция сжать заголовки до 64 бит (8 байт). JEP 519 делает это стабильной, проверенной фичей, которую можно безопасно включать прямо в проде.
Зачем?
Минус 22% памяти в SPECjbb2015
Минус 8% CPU в среднем
Минус 15% сборок мусора в G1 и Parallel GC
+10% скорость парсинга JSON
Для распределённых систем, высоконагруженных сервисов и микросервисов — это простой способ сэкономить ресурсы без переписывания кода.
Как включить?
В Java 25 больше не понадобится флаг
-XX:+UnlockExperimentalVMOptions
Теперь достаточно:
java -XX:+UseCompactObjectHeaders ...
Пруфы?
Протестировано в проде на сотнях сервисов Amazon.
Прогнано по полному тест-сьюту JDK в Oracle.
Отдельные компании уже бэкпортят фичу на JDK 21 и 17.
Что важно знать?
По умолчанию выключено.
Не влияет на функциональность приложения.
Может потребовать внимания в будущем, если другие фичи потребуют больше битов в заголовке (но для этого есть решения в рамках проектов Valhalla и Lilliput).
Обсудим в комментариях? ?

Присоединяйтесь к русскоязычному сообществу разработчиков на Spring Boot в телеграм — Spring АйО, чтобы быть в курсе последних новостей из мира разработки на Spring Boot и всего, что с ним связано
TimurZhoraev
Обычно unused/reserved в заголовках объектов и даже байт-кода виртуальных машин используют для отладки, особенно на многопоточке, сопоставляя с идентификаторами, плюс возможность исключения циклических ссылок при очистке памяти, плюс пометка сборщиком мусора, временные объекты, кешированные, в процессе получения данных по асинхронке или сериализации. Интересно как с точки зрения этих аспектов дела обстоят при такой оптимизации