Платформа, которую годами упрекали в консерватизме, разворачивается лицом к производительности. JDK 27 заморозил состав релиза, а Java 28 готовит первый preview value-классов - то, чего сообщество ждало больше десяти лет.
JDK 27: тихая революция в заголовках объектов и сборщике мусора
4 июня JDK 27 вошёл в Rampdown Phase One: финальный список фич зафиксирован, новые JEP в поезд не сядут. Релиз назначен на 15 сентября 2026 года. И хотя дата звучит буднично, состав версии - нет.
Главный сюрприз - компактные заголовки объектов по умолчанию. Звучит как внутренняя кухня JVM, но следствие вполне ощутимое: заголовок схлопывается с 96 до 64 бит, heap худеет на 10-20% без единой правки в пользовательском коде. В JDK 24-26 фича жила за флагом как экспериментальная. Теперь она включается сама. Для нагруженных сервисов с большим числом объектов в памяти это прямая экономия железа.
Второй шаг - G1 становится сборщиком мусора по умолчанию во всех окружениях, не только серверных. До сих пор на десктопах и в embedded-сценариях по умолчанию мог запускаться Serial GC. Теперь единообразие: G1 везде. Плюс к этому - поддержка постквантового обмена ключами для TLS 1.3 и редактирование данных прямо в JFR-потоке.
Valhalla добралась до preview
Проект Valhalla тлел в недрах OpenJDK почти десятилетие. И вот - JEP 401 с value-классами выходит в preview в Java 28. Это не черновик и не proof-of-concept. Это реальный шаг к изменению модели памяти языка.
Суть value-классов в двух словах: объекты без identity. Нет указателя на конкретное место в куче - есть только значение. Отсюда два практических следствия:
- Сравнение через == работает по значению, а не по адресу. Два объекта с одинаковыми полями - одно и то же.
- Синхронизация через synchronized невозможна: не на чем блокироваться.
JVM получает право хранить такие объекты прямо на стеке или инлайнить их в массивы - без лишних аллокаций и давления на GC. Для численных вычислений, финансовых систем и высоконагруженных сервисов это потенциально меняет расклад кардинально.
Что ещё движется в экосистеме
Параллельно с платформой не стоит на месте и окружение. Hibernate 7.4 закрыл давнюю боль с пагинацией при join fetch - раньше она происходила в памяти приложения, что при больших выборках грозило OOM. Теперь база делает это сама через подзапрос с limit/offset. Заодно появилась нативная поддержка audit-таблиц без Envers.
Spring AI 2.0 переработал Tool Calling: архитектура стала компонентной, агенты собираются гибче, а структурированные ответы от моделей теперь можно переспрашивать автоматически, если модель ответила не в том формате. Мелочь - но именно такие мелочи превращают прототип в production-код.
Отдельного внимания заслуживает тема дедлоков в ExecutorService. Паттерн, при котором задача внутри пула пытается дождаться другой задачи из того же пула, - классическая ловушка. Однопоточный executor блокируется моментально. Масштабируется на любой размер пула через цепочку взаимозависимых задач. Виртуальные потоки снимают симптом, но не причину - и об этом стоит помнить.
Куда движется платформа
Картина складывается отчётливая. Java последовательно закрывает три фронта: производительность на уровне рантайма, безопасность на уровне протоколов и удобство на уровне языка. Value-классы, компактные заголовки, постквантовая криптография - это не точечные патчи. Это сдвиг платформы.
Тем, кто до сих пор сидит на JDK 11 или, страшно сказать, JDK 8, стоит хотя бы поглядеть на инструменты миграции - OpenRewrite и jdeprscan умеют брать на себя значительную часть механической работы. Оставаться на легаси сегодня дороже, чем переехать.