Всем привет! 👋👋👋👋👋

Мы — Java-разработчики Т-Банка: Андрей, Арсений, Роман, Константин и Константин. Собираем интересные новости, статьи, туториалы и другие материалы из мира Java-разработки и делимся этим со всем сообществом.

В этом выпуске разбираем, почему G1 в JDK 27 окончательно прописывается дефолтным сборщиком мусора, и смотрим, что там с очередным, двенадцатым по счету инкубатором Vector API (спойлер: все по-прежнему ждем Valhalla). Заглянем в Netflix, посмотрим, как раскатили AOT из Project Leyden в прод и срезали время старта сервисов на 15—20%. Поговорим про то, как снимать heap-дампы с прода и не получить по шапке от безопасников, а заодно разберемся, зачем вообще были нужны гибкие конструкторы из Java 25. Посмотрим обзор фич Java 26 от Николая Парлога. Из любопытного — статья, где автор 18 месяцев гонял на проде два одинаковых сервиса на Spring Boot и Node.js и в итоге насчитал разницу в 24 тысячи долларов. Ну и пробежимся по свежим релизам: Micronaut 5.0, Quarkus 3.35 и 3.36, Spring AI и не только. Поехали!

Горячие JEPы

JEP 537: Vector API (Twelfth Incubator). «Самый» горячий JEP в этом месяце — двенадцатый инкубатор Vector API. Изменений все еще нет, все также ожидается Project Valhalla.

JEP 533: Structured Concurrency (Seventh Preview). Седьмое превью Structured Concurrency для Java 27. Из нового — небольшие изменения в API, призванные облегчить обработку ошибок и таймаутов.

JEP 523: Make G1 the Default Garbage Collector in All Environments добавлен в JDK 27. В OpenJDK появился JEP 523: он предлагает сделать G1 сборщиком мусора по умолчанию вообще для всех запусков HotSpot, а не только для server-конфигураций. 

Сейчас JVM в некоторых маленьких окружениях все еще может выбрать Serial GC — например, когда мало CPU и памяти. Идея JEP проста: G1 за последние годы подтянули по задержкам, throughput, startup time и потреблению native memory, поэтому отдельное правило для Serial GC хотят убрать. Для большинства разработчиков это не новая фича, а упрощение поведения JVM: если GC явно не указан, HotSpot всегда выбирает G1. Важно, что JEP не удаляет Serial GC и не запрещает выбирать другой сборщик вручную: -XX:+UseSerialGC, -XX:+UseZGC и остальные флаги продолжают работать как раньше.

Главные новости

Maintenance of the macOS/x64 port. Apple скоро прекратит поддержку x64 программ для Mac, в связи с этим в Oracle также прекращают поддержку x64 для Mac с JDK 27. Они предлагают заняться этой поддержкой самостоятельно, если это кому-то нужно.

Интересные видео

Java 26: Better Language, Better APIs, Better Runtime. Обзор нововведений языка от Николая Парлога. Среди основных изменений в версиях 22—25:

  • языковые улучшения: гибкие конструкторы, упрощенный main, импорт модулей;

  • новые API: Stream Gatherers, FFM, Class-File API;

  • доработки производительности и AOT-компиляции; 

  • доработки инструментов вроде JavaDoc и JFR.

Еще Николай рассказал о нововведениях Java 26: Primitive Patterns для примитивных типов, Lazy Constants для более эффективной ленивой инициализации, полноценная поддержка HTTP/3 и развитие Structured Concurrency с новыми механизмами обработки результатов и ошибок. Основной посыл: Java становится проще, производительнее и удобнее для разработчиков.

Java AOT in Production at Netflix. Обзор внедрения AOT из Project Leyden в Netflix от Мартин Чалупа и Иэн Брауна.


Проблема: ряд Java-сервисов запускался слишком медленно для автоскейлинга, поэтому их приходилось держать в «горячем» резерве. Было запущено больше инстансов приложения, чем нужно, чтобы при пике нагрузки не пришлось добавлять инстансы, ждать прогрева JVM и так далее. Все это приводило к высоким затратам.

Решение: внедрение AOT и Project Leyden, что позволило сократить время запуска и прогрева JVM. В видео рассказывается о релизном пайплайне с учетом нововведений:

  • запуск canary-релиза;

  • локальная запись AOT-архива;

  • сжатие архива и его загрузка в S3 для использования самим приложением.

В результате время прогрева сократилось, а время старта отдельных сервисов уменьшилось на 15—20%. Netflix считают это решение уже production-ready и планируют распространить его использование на все сервисы в компании.

Make Java Safer with Flexible Constructor Bodies — Inside Java Newscast #111.

В этом выпуске IJN рассказывается о том, как гибкие конструкторы добавленные в Java 25, помогут сделать Java-код безопаснее. Нововведение позволяет в дочернем классе вызывать код перед super() в конструкторе (кроме instance-методов).

Рассматриваются две проблемы:

  • Проверка инвариантов в конструкторе. Это случай, когда в дочернем классе нужно более строго провалидировать некоторые параметры. Например, родительский класс Person валидирует, что поле age > 0, а дочерний Employee — что age > 18 и age > 64.

  • Нарушение целостности дочернего класса. Случай, когда требуется добавить параметр, которого нет в родительском классе, и также его провалидировать. Например, добавить идентификатор сотрудника в Employee и в конструкторе проверять, что он больше 0.

Обе проблемы легко решаются добавлением соответствующих валидаций в конструкторе дочернего класса перед super().

Agent-Agnostic Guardrails: Universal Java Code Quality with Agents.MD and Static Analysis. В докладе рассматривается проблема неконсистентности кода, генерируемого разными ИИ-агентами. Код будет отличаться по качеству, по конвенциям, по форматированию, по архитектуре и так далее. Тут вступает в дело контекст-инжиниринг: мы должны дать агенту такой контекст, чтобы получившийся код отвечал стандартам нашего проекта. В докладе освещается несколько инструментов:

  • AGENTS.md — файл, в котором в виде маркдауна описывается человекочитаемый контекст, который агент подхватит. Там можно описать конвенции, архитектуру, какие шаги необходимо сделать во время работы. Таких файлов может быть несколько. Каждый может содержать контекст специфический для конкретного модуля или слоя.

  • Checkstyle — инструмент для поддержания единого code style.

  • SpotBugs — линтер, позволяющий отловить наиболее типичные ошибки.

  • ArchUnit — инструмент для описания архитектуры через тесты.

Цель доклада — агент вне зависимости от своего вендора и версии должен генерировать такой код, чтобы на ручном ревью разработчик мог сконцентрироваться именно на функциональной части.

Полезные статьи

Анализируем heap-‑дампы с прода, не привлекая внимания безопасников.В статье освещается важная проблема — в heap-дампах, снятых с прода, может находиться чувствительная с точки зрения безопасности информация: логины, пароли, идентификаторы и так далее. На примере Spring PetClinic REST автор показывает, как в Eclipse MAT с помощью OQL-запроса можно получить, например, пароль пользователя. Поэтому перед передачей дампа на анализ данные следует обфусцировать. 

В статье освещается три инструмента:

  • Eclipse MAT имеет гибкие настройки, но сам тяжелый (100 МБ), поэтому его сложно встроить в CI/CD. Кроме того, для обфускации ему нужно распарсить дамп, а потому на больших объемах могут потребоваться танцы с бубном.

  • heap‑dump‑tool — легковесный, который легко можно вставить в CI/CD в качестве шага по обфускации дампа, но имеет не такие гибкие настройки и тоже может подводить на больших объемах.

  • hprof‑redact — имеет гибкие настройки, легковесен и хорошо работает с большими дампами, так как обрабатывает их в потоковом режиме. А еще эффективно сжимает исходный дамп. Находится на стадии прототипа.

Автор отмечает, что и в саму JDK-8337517 хотят встроить подобный инструмент. Сейчас все находится на уровне концепта, конкретных сроков нет.  

Creating an AI Skill for Debugging Flaky Tests. В блоге JetBrains рассказывается, как они научили AI-агента искать причины «моргающих» тестов не через догадки, а через анализ путей исполнения и покрытия.

Интересен кейс применения ИИ не для генерации кода, а для прикладного анализа и переиспользуемости получившегося скилла на разных проектах.

Scaling ArchUnit with Nebula ArchRules. В этой статье Netflix рассказывает, как они масштабировали ArchUnit на тысячи Java-/Kotlin-сервисов, отказавшись от AST-анализаторов вроде PMD и сохранив единую точку истины для архитектурных правил. Для этого они сделали Nebula ArchRules — общую систему архитектурных проверок для всей компании. Идея проста: подключаешь JAR с правилами, а Gradle-плагин их запускает. Самое интересное здесь — именно механизм централизации и применения этих правил на разных сервисах и стеках.

Любопытный подкаст

Inside Java Podcast: Java Gets Post-Quantum TLS. Разговор про JEP 527 и гибридный post-quantum key exchange для TLS 1.3: обсуждают, зачем в JDK добавляют ML-KEM, как будет работать гибридный обмен ключами и почему это важно подготовить заранее, а не в день, когда старые алгоритмы станут уязвимы.

Просто интересное

Spring Boot vs Node.js: I Ran Both in Production for 18 Months. One Cost $12,000 More. Guess Which. Статья со сравнением двух одинаковых сервисов на Spring Boot и NodeJs. Их крутили на реальном проде в одинаковых условиях 18 месяцев, в итоге сервис на Spring оказался дешевле на 24 000 долларов. Из них 5 400 — разница в цене по железу, остальное — примерные человеко-часы, потраченные на поддержку. 

В основном в сервисе с NodeJs столкнулись с утечками памяти, которые долго фиксили, с кучей критических уязвимостей в сторонних библиотеках и с обжорством под нагрузкой. Хотя 100% доверия статья и не вызывает, по ней можно сделать интересные выводы.

LLM-assisted coding is not deterministic. It does it matter? Размышление о том, насколько важен в контексте разработки ПО тот факт, что ИИ-агенты выдают не детерминированный код. Автор считает, что главный вопрос — то, насколько поведение получившегося кода будет предсказуемым. 

Современная разработка ПО комплексная задача. Программы работают в средах с огромным количеством побочных факторов: железо, драйвера, сеть, контейнеры, конфигурационные файлы и так далее. Приводится аналогия с метеорологией: тогда как законы физики детерминированные, погоду можем лишь предсказывать. Поэтому нужно сконцентрироваться на практиках, которые будут повышать предсказуемость работы систем и позволят быстро понять и решить проблему, если что-то пойдет не так: тесты, метрики, быстрые роллбэки, разные среды развертки и так далее.   

Джавовые события

На dev.java опубликовали календарь ближайших Java-конференций: JNation, JBCNConf, J-Spring, DevBcn, Devoxx Poland и другие события. Удобная точка входа, если планируете поездки или хотите потом быстро найти записи и слайды: в одном месте собраны даты, города и ссылки на страницы мероприятий.

29 августа в штаб-квартире Т-Банка пройдет JVM-Day — конференция о технологиях для инженеров.

Свежие релизы

Spring AI 1.0.8, 1.1.7, 2.0.0-M7: очередной шаг к production-ready AI в Spring.

В мае Spring AI выпустил сразу несколько обновлений: патчевые 1.0.8 и 1.1.7 плюс milestone 2.0.0-M7. В стабильных версиях в основном закрывали баги и security issue CVE-2026-41863. А вот M7 интересен направлением развития: Spring AI активно приводит в порядок tool calling и MCP. SSE-транспорт для MCP уходит в deprecated, новым дефолтом становится Streamable HTTP, а tools теперь можно описывать более явно через новый ToolSpec API. Это не громкая фича для всех Spring-разработчиков, но важный шаг для тех, кто строит AI-агентов и хочет меньше магии в интеграции модели с прикладным кодом.

Micronaut Framework 5.0.0 Released! Micronaut 5.0.0 — не просто очередной minor-релиз, а большой platform refresh. Фреймворк обновляет baseline до Java 25, Groovy 5 и Kotlin 2.3, подтягивает GraalVM до 25.0.3 и обновляет managed dependency ecosystem более чем для 70 Micronaut-модулей.

Главная идея Micronaut остается прежней: как можно больше работы делать на этапе сборки, а не в runtime. В пятой версии доработали IoC-контейнер, bean resolution, qualifier handling, precomputed bean indexes и другие внутренности, чтобы приложение быстрее стартовало и меньше занималось «рефлексивной магией» во время выполнения. Из прикладного интересного: HTTP/3 на Netty стал stable, появились JSpecify nullability annotations, программные retry/circuit breaker API, обновился Micronaut Test, а Micronaut Data получил geospatial support и mapping для SQL vector types.

A2A Java SDK 1.0.0.CR1: Java SDK для Agent2Agent почти дошел до GA.Вышел A2A Java SDK 1.0.0.CR1 — candidate release Java SDK для Agent2Agent Protocol. A2A — протокол, с помощью которого AI-агенты могут общаться друг с другом независимо от того, на каком языке, фреймворке или модели они написаны. SDK дает Java-разработчикам готовую основу, чтобы поднимать A2A-совместимых агентов, а reference implementation сделана на Quarkus. 

Главная новость CR1 — совместимость с протоколом v0.3. Это важно, потому что переход на A2A 1.0 ломает часть старых контрактов, а реальные системы редко обновляются одновременно. Теперь новые v1.0-агенты смогут общаться с клиентами и серверами, которые еще живут на v0.3. Помимо этого добавили Android HTTP client, унифицировали HTTP-клиенты и поправили SSE parser под спецификацию.

Вышел GlassFish 8.0.2 — maintenance-релиз Jakarta EE 11-совместимого сервера. Основной акцент на исправлениях и security-updates, поэтому релиз полезен тем, кто уже тестирует переход на Jakarta EE 11 или держит GlassFish как reference/runtime для совместимости.

Quarkus 3.35 и 3.36: performance-фичи, AOT и стабилизация. В мае у Quarkus вышло два релиза подряд: 3.35 и 3.36. Главный интерес здесь не столько в очередном наборе исправлений, сколько в новых performance-возможностях из 3.35, которые потом продолжили стабилизировать в следующем релизе.

Самое заметное — экспериментальный JAR tree-shaking.

Quarkus теперь может анализировать, какие классы реально достижимы в приложении, и выкидывать неиспользуемые классы из runtime-зависимостей. Идея похожа на то, что давно делают frontend-бандлеры: если код в итоговом приложении не нужен, его можно не тащить в артефакт. 

Еще одна важная вещь — Profile-Guided Optimization для native builds. Quarkus может прогнать integration tests как workload, собрать профиль выполнения и использовать его при native-компиляции. Похожий подход у Project Layden, чтобы стартовать предпрогретое приложение. Это делает native image менее холодным: компилятор получает информацию о том, какие пути в приложении реально используются. 

Отдельно добавили поддержку Semeru AOT. Это не Project Leyden и не GraalVM Native Image, а механизм из IBM Semeru / OpenJ9. В нем JVM может сохранять заранее скомпилированный код в shared cache и переиспользовать его при следующих запусках. В примере rest-json startup time сократился примерно с 380 до 190 мс. 

На фоне этого Quarkus 3.36 выглядит скорее как стабилизационный релиз: обновления зависимостей, исправления и доведение платформы после более насыщенного 3.35. Но если вы уже экспериментируете с tree-shaking, native PGO или Semeru AOT, на 3.36 тоже стоит смотреть: такие фичи лучше пробовать не на первом же релизе, где они появились.

Spring Cloud Function и Spring Cloud Config security releases. Spring выпустил патч-релизы для Spring Cloud Config и Spring Cloud Function из-за набора CVE. Если есть Config Server — это обязательное обновление.

Open Liberty 26.0.0.5 получил официальную поддержку Jakarta EE 11 и Spring Boot 4.0. Для enterprise Java это заметный релиз: Jakarta EE 11 подтягивает новые версии спецификаций, а Liberty теперь проще использовать как runtime для современных Spring Boot-приложений. Еще обновили работу с TLS/SSL cipher suites.

Eclipse Vert.x 5.0.12 — небольшой, но важный security/bugfix-релиз. Внутри обновление до Netty 4.2.13.Final, которое закрывает пачку уязвимостей в Netty. Если у вас reactive-сервисы на Vert.x или фреймворк, который тащит Vert.x транзитивно, релиз стоит посмотреть.

LangChain4j 1.15.0 продолжает быстро обновляться. В майских релизах заявлена поддержка Spring Boot 4-зависимостей в BOM и новые starter-артефакты для Boot 4.

Gradle 9.5.1 и 8.14.5. В мае вышли свежие релизы в двух актуальных ветках: 9.5.1 и 8.14.5. Для команд, которые уже перешли на Gradle 9, это очередной patch-релиз, а 8.14.5 полезен тем, кто пока остается на версии 8.x из-за совместимости плагинов.

Спасибо за прочтение! Ждем обратную связь в комментариях. Увидимся через месяц 😉

Присылайте материалы, если встретили что-то интересное, — опубликуем в следующем выпуске!