A Look at Upcoming Innovations in Electric and Autonomous Vehicles Java рвётся вперёд. Valhalla выходит из тени

Java рвётся вперёд. Valhalla выходит из тени

Java рвётся вперёд. Valhalla выходит из тени

Платформа, которую годами упрекали в консерватизме, разворачивается лицом к производительности. 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 умеют брать на себя значительную часть механической работы. Оставаться на легаси сегодня дороже, чем переехать.