
Всем привет! ????? Мы Java-разработчики Т-Банка: Андрей, Арсений, Роман, Константин и Константин. Собираем интересные новости, статьи, туториалы и другие материалы из мира Java-разработки и делимся этим со всем сообществом.
В этом выпуске будут материалы о том, как ускорить запуск приложений с помощью ReadyNow и CRaC — двух подходов к оптимизации старта. Разберем тонкости аннотации @TestInstance(PER_CLASS) в JUnit 5 и ее влияние на жизненный цикл тестов.
Тем, кто работает со Spring, может пригодиться обзор Spring Debugger от JetBrains — плагина, который делает отладку наглядной и удобной. Еще будет доклад о повышении производительности Spring Data JPA и Hibernate. И в завершение — сравнение FFM API с Unsafe: посмотрим, какой трейдофф между скоростью и безопасностью предлагает новый подход. Приятного прочтения!
Горячие JEPs
JEP 519: Compact Object Headers. Начиная с Java 25, Compact Object Headers больше не находятся в статусе Experimental, а полностью интегрированы в JDK. Включить их можно с помощью флага -XX:+UseCompactObjectHeaders.
JEP 514: Ahead-of-Time Command-Line Ergonomics направлен в JDK 25. Это упрощает создание AOT-кэшей, ускоряющих запуск Java-приложений. JEP позволяет выполнять тренировочный прогон и генерацию кэша за один шаг с помощью новой опции -XX:AOTCacheOutput. Это делает процесс более удобным для типичных сценариев, не меняя текущий AOT-пайплайн.
JEP 507: Primitive Types in Patterns, instanceof, and switch (3rd Preview) направлен в JDK 25. JEP расширяет pattern matching, позволяя использовать примитивные типы во всех контекстах, включая instanceof и switch.Это делает Java более выразительным и безопасным при работе с преобразованиями типов. Primitive Types in Patterns, instanceof, and switch — это preview-фича, направленная на унификацию обработки данных и устранение фрагментарности между ссылочными и примитивными типами.
JEP: 508: Vector API (10th Incubator) направлен в JDK 25. 10-й инкубатор, юбилейный! JEP предлагает удобный и переносимый API для векторных вычислений. API компилируется в оптимальные SIMD-инструкции на поддерживаемых процессорах, обеспечивая производительность выше, чем у скалярного кода. В JDK 25 добавлена интеграция с FFM API и автонейтрализация операций с Float16, что улучшает переносимость, предсказуемость и поддержку новых архитектур. Как и раньше, релиз ждет Project Valhalla.
Свежие релизы
Разработчики Jakarta EE 11 наконец-то выпустили релиз. Это заняло больше времени, чем планировалось, из-за масштабного рефакторинга. Eclipse GlassFish снова стал эталонной реализацией для платформы Jakarta EE 11 и Jakarta EE 11 Web Profile. Больше деталей — в этом видео.
Вышел 6-й milestone release Spring Framework 7.0.0 с исправлениями ошибок, улучшением документации, обновлениями зависимостей. Из новых возможностей: поддержка проекта Spring Retry и метод getObjectMapper() в классе MappingJackson2MessageConverter (взамен устаревшего JacksonJsonMessageConverter). Вышли версии 6.2.8 и 6.1.2 с исправлением уязвимости CVE-2025-41234, связанной с заголовком Content-Disposition и возможной атакой Reflected File Download при использовании не-ASCII-символов в имени файла, получаемом от пользователя
Spring Cloud 2023.0.6 представляет исправления багов и важные обновления своих под-проектов: Spring Cloud Gateway 4.1.9, Spring Cloud Circuit Breaker 3.1.5 и Spring Cloud Contract 4.1.6. Одно из значимых обновлений — удаление артефакта spring-cloud-stub-runner-boot из Maven Central ввиду новых ограничений на публикацию исполняемых JAR. При необходимости используйте образ Spring Cloud Contract Docker. Более подробную информацию можно найти в примечаниях к выпуску.
Релиз Quarkus 3.24.0 представляет новую админку Dev UI Assistant, позволяющую взаимодействовать с assistant module. Обновленные зависимости содержат Hibernate ORM 7.0, Hibernate Validator 9.0 и Apache Kafka Client 4.0. Более подробную информацию смотрите в примечаниях к выпуску.
Вышел релиз Kotlin 2.2.0, содержащий исправления багов и значимые изменения, такие как:
перевод Guard Condition, Non-Local Break and Continue и Multi-Dollar String Interpolation из экспериментальных в стабильные;
улучшение аннотации @JsPlainObject для корректной компиляции кода с inline-suspend- и non-suspend-функциями.
Подробная информация — в release notes. Презентация релиза состоится 10 июля 2025.
Red Hat совместно с Google выпустили Agent2Agent Java SDK — библиотеку для реализации протокола Agent2Agent (A2A) и запуска агентных приложений как A2AServers. SDK включает компоненты для создания agent card, управления агентами и коммуникации между ними.
Beehive Lab выпустила GPULlama3.java — первую нативную реализацию Llama3 на Java с автоматическим ускорением на GPU через TornadoVM, что позволяет запускать большие языковые модели эффективно прямо в Java-приложениях, без низкоуровневого программирования. Проект поддерживает современные GPU (NVIDIA, Intel, Apple Silicon), работает с Java 21+.
Четвертый milestone release Project Reactor 2025.0.0 выпущен с обновлениями зависимостей (reactor-core 3.8.0-M4, reactor-netty 1.3.0-M4 и др). Важно: с этого релиза Reactor Kafka больше не входит в BOM Project Reactor, так как поддержка была прекращена в мае 2025.
Вышла Kora 1.1.29! Добавлены:
в OpenAPI-генератор — поддержка опций ImplicitHeaders и ImplicitHeadersRegex;
опция enabled для всех resilient-компонентов в конфигурацию;
поддержка KafkaClientMetrics метрик Micrometer для Kafka-потребителей;
провайдер серверных тегов Micrometer для gRPC-сервера.
Исправлена ленивая инициализация content-type для JDK HTTP-клиента и логирование тела для HTTP-клиента.
Интересные видео
Java 25 Brings 18 JEPs ? Inside Java Newscast #92
Следующий LTS-релиз принесет много изменений, и в видео Николай коротко проходится по каждому из них. Рассказать есть о чем: о гибких телах конструкторов, scoped-переменных, паттернах примитивных типов, AOT-профилировании и многом другом. Нас ждет очень горячий сентябрь!
Java 25 Encodes PEM — Inside Java Newscast #93. Николай рассказал про новый API PEM в Java. Для начала — про PEM(Privacy-Enhanced Mail): название уже не сильно отражает действительность. Почти каждый видел, как выглядит PEM, например, когда добавлял ssh-ключи в GitLab, GitHub. Про новое API есть JEP 470: будет два интерфейса для шифровки и дешифровки данных и набор sealed-классов для разных алгоритмов. API будет доступно пока в качестве превью в Java 25.
Key Java Language Updates From 2020 to 2025. Видео посвящено 30-летию Java и рассказывает, как он поменялся за последние 5 лет. Сначала прошлись по record- и sealed-классам. Основная часть ролика посвящена JEP 513: Flexible Constructor Bodies, данный JEP войдет в состав JDK 25. В конце поговорили про будущее. Pattern Matching для всех классов — не только для record. Valhalla с value classes и null-информацией о типах, как в Kotlin. String Templates все-таки живые.
Полезные статьи
Цикл статей о ReadyNow — технологии, позволяющей улучшить производительность Java-приложения на старте путем предварительного сохранения профиля нагрузки. Благодаря предварительному сохранению получается пропустить этап сбора статистики и сразу скомпилировать необходимые куски байт-кода в нативный код.
Faster Java Warmup: CRaC versus ReadyNow. В первой статье на базовом уровне рассказывается о ReadyNow и она сравнивается с CRaC-технологией, направленной на ускорение старта приложения
How ReadyNow Improves Java Warmup Time. Во второй статье автор больше погружается в ReadyNow и то, как она работает. Также приводятся тесты и сравнения того, насколько JVM быстрее прогревается при использовании ReadyNow.

Константин Максимов
А чем это отличается от проекта Leyden?

Андрей Орлов
Цели и правда преследуются похожие, но Leyden старается все это сделать максимально безболезненно, без необходимости в доработках приложений. И дополнительно он концентрируется на AoT-компиляции. Но Leyden пока еще в разработке, а это уже есть :)
@TestInstance(PER_CLASS) в JUnit 5: как и зачем переопределять жизненный цикл. Разбор фичи JUnit 5, которая позволяет изменить жизненный цикл тестов. Обычно тестовый класс пересоздается для каждого метода, а с аннотацией @TestInstance(PER_CLASS) это будет происходить один раз для каждого класса. Это дает хороший профит в плане ускорения прогона тестов и требует дисциплины, чтобы не нарваться на проблемы с shared state.
Автор приводит пример использования ElasticContainer. Без этой настройки встроенная БД Elastic будет инициализироваться с нуля для каждого теста, что занимает время. Включая настройку @TestInstance(PER_CLASS), мы значительно сокращаем время прогона тестов, но берем на себя ответственность по очистке БД между запусками.

Константин Максимов
Автор говорит про дисциплину, и это в целом правильно, но есть ряд но. Проект могли передать другой команде, новичок в команде может не знать правил, а на ревью можно легко что-то проглядеть. Даже опытный разработчик может забыть и ошибиться. А для приведенной практики соблюдать конвенции крайне важно, ведь разбираться с проблемами shared state — то еще удовольствие. Я за автоматизацию исполнения таких конвенций. Вся очистка контекста должна происходить в одном базовом месте. Условно в некоем интерсепторе мы пропишем очистку всех таблиц в БД после прогона каждого теста. Скорее всего, это все еще будет быстрее, чем переподнимать БД. В то же время разработчикам и тестировщикам не придется беспокоится об этом в контексте конкретных тестов
Demystifying Spring Boot With Spring Debugger. Обзор плагина Spring Debugger от JetBrains. Этот плагин позволяет удобнее дебажить Spring-приложения, а еще наглядно показывает, какие бины загружены в контекст, какие свойства какими значениями проинициализированы и какая транзакция активна на момент той или иной точки остановки.
Прокачана возможность исполнять код во время отладки. Можно выполнять методы бинов и устанавливать значения свойств. В этом поможет автодополнение.
Spring Data JPA и Hibernate: ориентируемся на производительность. Часть 1.
Перевод доклада Мацея Валковяка Performance oriented Spring Data JPA & Hibernate, сделанный командой Spring АйО. Это первая из трех частей, и она сконцентрирована на управлении коннектами к БД. Приводится несколько полезных инструментов, которые позволят лучше понимать, что происходит за кулисами. А еще дается несколько простых, но очень действенных советов и практик — от проставления правильных флагов в настройках до менеджмента транзакций.
Java’s Structured Concurrency: Finally Finding Its Footing. Статья про Structured Concurrency, которое уйдет на 5-е превью в Java 25. Можно посмотреть, как будет выглядеть будущее многопоточного программирования на Java.
Автор разобрал новое API с примерами. Основное нововведение — join на стероидах, который позволит выбрать стратегию обработки ответов нескольких тасков. Например, дождаться первого успешного ответа. Помимо стандартных Joiners, которые предоставит Java, можно будет написать свои. Немного затронули ScopedValue, таймауты и InterruptedException. А в конце статьи — бонус в виде набора различных примеров применения нового API.
FFM vs. Unsafe. Safety (Sometimes) Has a Cost. Небольшая статья, сравнивающая производительность нового FFM(Foreign Function and Memory) API со старым добрым Unsafe. Из графиков в статье видно, что FFM проигрывает при малом числе операций с памятью, но при увеличении количества итераций догоняет своего предка, уступая совсем чуть-чуть. Для операции записи потребуется от 10 до 100 итераций, а для записи — от 100 до 1000. При этом существуют оптимизации JIT-компилятора, которые позволяют догнать Unsafe и при меньшем количестве итераций. Несмотря на то что такой подход медленнее, он намного безопаснее из-за проверок, а в проде надежность приложений очень важна.
Clean and Modular Java: A Hexagonal Architecture Approach. В статье предлагается подход по использованию гексагональной архитектуры на уровне деления проекта на модули. Автор использует деление на модули, чтобы отделить бизнес-логику (ядро) от внешних зависимостей (БД, UI, API) через порты и адаптеры, что упрощает тестирование, поддержку и масштабирование приложения.
Benchmarking and profiling Java code with JMH. Статья посвящена использованию JMH (Java Microbenchmark Harness) для бенчмаркинга и профилирования Java-приложений. Она объясняет, как JMH помогает разработчикам измерять производительность кода, выявлять узкие места и оптимизировать приложения, предоставляя практические примеры и советы по его применению.
Java 25 Integrates Compact Object Headers with JEP 519. И снова о том, что Compact Object Headers были интегрированы в JDK 25, но в этот раз уже в виде небольшой статьи. Специально для тех, кто не любит копаться в JEPs.

Андрей Орлов
Бенчмарк SPECjbb2015 показал уменьшение потребления памяти на 22%. В Amazon заявляли об улучшении утилизации CPU до 30% на многих сервисах. Интересно посмотреть на это в продакшене самостоятельно
Просто интересное
Premature Design Is Not Design. В статье автор рассказывает о том, как преждевременное переусложенение дизайна приложений может привести к проблемам. Приводятся два примера: использование RBAC и DRY. Автор показывает, как легко можно нырнуть в кроличью нору в попытке сделать со старта идеальный и красивый дизайн, и предлагает пути, как этого можно избежать. А еще выводится полезный постулат: весь дизайн сводится к тому, насколько просто вносить изменения. Потому что на самом деле дизайн должен меняться вместе с новыми требованиями и задачами, а не быть идеальным и универсальным с самого старта.
Как Cursor устроен изнутри. Статья написана на основе беседы с Cуалехом Асифом — основателем Cursor и поделена на две части. В первой нам дают немного интересной статистики:
50: количество инженеров, работающих над Cursor;
1M: транзакций в секунду (и выше при пиковой нагрузке);
100×: рост пользователей и нагрузки за 12 месяцев, который временами удваивается каждый месяц;
100M+: строк кода, написанного в день с помощью Cursor корпоративными клиентами.
Первая часть статьи знакомит с тем, как работает десктопное приложение. Мы узнаем, какие механизмы стоят за теми самыми tab-дополнениями кода.
Вторая часть сконцентрирована на серверной части и команде разработки. Какие были приняты инженерные и архитектурные решения, чтобы выдерживать нагрузку 1M rps и более. Отдельного упоминания заслуживает потрясающий эпизод перехода с БД PostgreSQL на Turbopuffer прямо во время критичного сбоя! Крайне увлекательно ?
История Java: развитие, изучение Марса, битва с Microsoft, Spring, Gradle и Maven, IntelliJ IDEA и Eclipse. Объемная, но совсем несложная статья про основные вехи развития Java и ее экосистемы — от идеи создания до наших дней.
Гайд по совмещению 5 работ: инструкция по самоуничтожению. Шуточная статья про переработки и устраивание на несколько работ в ИТ и к чему это приводит.
Арсений: «Просто отличная статья, которая заставила меня посмеяться :) В статье задорно рассказано об основных проблемах, с которыми вы можете столкнуться при чрезмерном подходе к работе, и о том, как с ними бороться».
Спасибо за прочтение! Ждем обратной связи в комментариях. Увидимся через месяц ?
Присылайте материалы, если встретили что-то интересное, — опубликуем в следующем выпуске!