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

В этом выпуске рассказываем, зачем в Java хотят перезапустить проект Detroit. Почему Kubernetes — база для Spring-разработчика. Какое возможное будущее у проверяемых исключений. Как уронить базу, пытаясь обновить кэш. Что такое carrier-классы, которые планируют ввести в Java в будущем. И еще много интересного. Приятного чтения! For those who code after… 🙂

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

CFV: New Project: Detroit. В Java хотят перезапустить проект «Детройт». Это перезапуск, оригинальный проект был нацелен на добавление возможности использовать JS из Java. В новом проекте смотрят на возможность доступа к AI-функциональности, написанной на Python, которой нет в Java.

Костя Польщиков

Инициатива кажется немного странной, так как уже есть GraalJs и Nashorn Engine, который является проектом OpenJDK. Как будто еще один движок для JS нам не очень нужен, у нас уже есть несколько. Плюс у нас есть проект Panama, который нацелен на интеграцию Java с не Java, — кажется, что логичнее увидеть его расширение.

Илья Кучмин: Kubernetes — это база для разработчика. Доклад-туториал о том, как поднять свое Spring-приложение в Kubernetes. При этом докладчик постарался охватить широкий диапазон тем: конфигурация, хранение секретов, балансировка, работа с БД и прочее. Конечно же, все это — с помощью OpenIDE 🙂

Towards Better Checked Exceptions — Inside Java Newscast #107. В новом выпуске Java Newscast обсудили возможное будущее проверяемых исключений. 

В начале рассмотрели подходы с проверяемыми исключениями и парой значение-ошибка (Either). В случае исключений акцент выставляли на то, что их нужно использовать осознанно и думать, что пользователь может с ним сделать, когда его получит. В случае пары основной проблемой выделили плохую читаемость: когда нужно вернуть несколько ошибок из одного метода, дженерик в паре схлопывается до общего типа Exception.

Поговорили о том, как можно соединить оба подхода. Например, позволить try конвертировать исключения в пару и добавить паре возможность указывать несколько исключений в дженерике Either<Object, Exception1 | exception2>. А еще улучшением может стать драфт, в нем предлагают обрабатывать исключения в switch-блоке. Важная мысль, что механизм проверяемых исключений может быть лучше, но для этого надо начать над ним работать.

Роман Елизаров: От языков программирования к Developer Experience. В докладе Роман продвигает мысль о том, насколько важна переменная когнитивной нагрузки в бюджете проекта. А еще о том, что нужно вкладываться в то, что делает жизнь разработчиков удобнее и легче 🙂

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

JDK 26 G1/Parallel/Serial GC changes будет интересна разработчикам и специалистам, работающим с Java и Hotspot VM, особенно тем, кто занимается настройкой и оптимизацией работы сборщиков мусора. Из нее можно узнать о значительных изменениях в JDK 26, которые повлияют на производительность и удобство работы с памятью, а также о новых возможностях и устаревших параметрах конфигурации.

Когда использовать параллельный стрим в Java — об использовании параллельных стримов в Java. В статье рассматриваются особенности и нюансы работы с параллельными стримами и их преимущества. Описаны и потенциальные проблемы, связанные с накладными расходами, разбиением источника данных, объединением результатов и локальностью данных в памяти. Приводятся примеры бенчмарков, демонстрирующие различные сценарии использования параллельных и последовательных стримов.

Роняем базу из-за кеша без смс и регистрации — перевод статьи How to Prevent 10,000 Concurrent Database Hits in 2 Seconds. Описан кейс, в котором БД легла под напором 10 000 одновременных запросов на обновление кэша из-за истечения TTL. 

Автор рассказывает об инциденте и приводит паттерны, которые можно применить, чтобы этого не допустить:

  • Stale-While-Revalidate — по истечении TTL отдать устаревшие данные и обновить кэш в фоне.

  • Probabilistic Early Expiration — распределить обновление данных по времени ранее истечения TTL.

  • Mutex / Single-Flight Refresh — один запрос эксклюзивно обновляет кэш. Остальные ждут либо отдают устаревшие данные.

HotSpot AOT-кэш: стартуем быстрее, греемся меньше — перевод статьи Run Into the New Year with Java’s Ahead-of-Time Cache Optimizations. В статье подробно рассказывается об AOT-компиляции и о том, как ее правильно готовить. Есть короткое описание самого процесса и бенчмарки, иллюстрирующие выигрыш в скорости старта с AOT-кэшем. 

Автор раскрывает, когда следует пересобирать AOT-кэш. Это потребуется при смене версии JDK, внесении правок в код приложения и запуске приложения на другой JVM. В конце — несколько советов по организации обучающего прогона, чтобы получить максимально эффективный AOT-кэш.

Руководство по ArchUnit — как модульно тестировать архитектуру перевод статьи ArchUnit Guide — How to Unit Test Your Architecture. Неплохой обзор возможностей ArchUnit. Автор коротко рассказывает о том, что это за инструмент и как он работает. Приводит несколько примеров тестов, которые можно написать: запрет инъекций через поля и сеттеры, исключение циклических зависимостей, настройка разграничений между слоями приложения и прочее. Полезно для знакомства с инструментом.

The State of Java on Kubernetes 2026: Why Defaults are Killing Your Performance. Небольшая статья о том, как более эффективно использовать Java-приложения внутри Kubernetes. Какой сборщик мусора JVM выбирает по умолчанию? G1 — ответят многие из нас и будут почти правы, только вот G1 будет выбран, если CPU не менее двух и RAM не менее 1791 МБ. А еще, если не указать XmX, JVM будет считать его как ¼ от имеющейся у пода RAM, то есть вы не будете использовать 75% выделенной вами поду памяти. 

Post-Quantum Hybrid Key Exchange for TLS 1.3. В JDK 27 добавлена поддержка гибридного post-quantum обмена ключами для TLS 1.3: классические алгоритмы сочетаются с квантово-устойчивыми, чтобы защитить соединения от будущих атак. Новые схемы, начиная с шестого early access build JDK27, включены по умолчанию и работают в стандартной реализации java.net.ssl без изменений в коде. 

Optimizations in Spring MVC. Небольшая статья в блоге Spring об оптимизациях Spring MVC. Показано, что часть затрат всегда идет на накладные расходы фреймворка, а другая часть растет линейно с объемом данных. Из оптимизаций, дающих существенный прирост, рассматриваются более тонкая настройка транзакций и использование виртуальных потоков.

Optimizing Java Class Metadata in Project Valhalla. Автор рассказывает о своей оптимизации в Project Valhalla, связанной с Value-классами. Суть в следующем:

  • Для каждого класса в его метадате создается массив InlineLayoutInfo. Он содержит информацию о каждом поле — какие из них можно заинлайнить, а какие нет.

  • Массив создается всегда, даже если таких полей нет или же просто никакие поля не были заинлайнены.

  • Автор предлагает не аллоцировать память на этот массив, пока не будет принято решение об инлайне хотя бы одного из полей, что позволяет сэкономить 16 × (число полей) байт в каждом классе без инлайнинга.

Все гениальное просто :)

Data-Oriented Programming for Java: Beyond Records. Автор рассказывает о следующем шаге развития Project Amber — идее carrier-классов и интерфейсов. Если коротко:

  • Java уже имеет records: у них удобный api и они позволяют не писать вручную бойлерплейт вроде геттеров, equals/hashCode и конструктора.

  • Предлагается разрешить обычным классам и интерфейсам объявлять описание классов подобное тому, как это сделано в records. Такие классы и интерфейсы называются carrier. Выглядеть это будет так: class Point(int x, int y) {…}

  • Поля можно объявить дополнительно в теле класса как component, чтобы или дать им мутабельность, или переопределить геттеры и сеттеры для этого поля.

  • Можно объявить дополнительные поля, не входящие в описание carrier-класса. Если такие поля нужно сразу инициализировать, то можно написать «компактный» конструктор, в котором нужно обозначить только такие поля.

Применяем кодогенерацию в Java для решения алгоритмических задач. Статья о том, как много несложного шаблонного кода можно переложить на кодогенерацию. В примере рассматривается задача трансляции деревьев. Для этого нужно описать большое количество обработчиков узлов, работающих всего с тремя операциями. 

Автор решил не писать их руками, а сгенерировать с помощью yaml-конфига и библиотеки для кодогенерации JavaPoet. Теперь большая часть преобразования покрывается yaml-конфигурацией, при изменении или добавлении преобразований нужно добавить пару строк в конфиг. Такой подход сопряжен с риском, потому что IDE не подсветит проблемы сгенерированного кода, но, так как в этом случае логика несложная и однотипная, кодогенерацию можно спокойно использовать.

Dissecting the CPU-Memory Relationship in Garbage Collection. Большая статья про новые способы профилирования затрат ресурсов на сборку мусора в JDK 26. Статья поделена на две части. В первой описано, как с эволюцией сборщиков мусора в сторону параллельной сборки мусора метрика, отражающая паузы для сборки мусора, все меньше отражала накладные расходы на сборку мусора. В ZGC паузы меньше нескольких миллисекунд, но это не означает, что он не стоит нам ресурсов. Просто работа ушла в фон, но она все еще есть, и мы все еще на нее тратимся. 

Во второй части статьи рассказывают, как новый метод MemoryMXBean.getTotalGcCpuTime() и новый флаг -Xlog:cpu делают прозрачнее мониторинг ресурсов, используемых сборщиком мусора.

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

Episode 48 “HTTP/3 in Java 26» посвящен обсуждению HTTP/3 и его интеграции в Java 26. В выпуске Nicolai Parlog беседует с Daniel Fuchs и Daniel Jelinski, Consulting Members of Technical Staff в Oracle и участниками OpenJDK, о клиенте HTTP в Java: от его появления в Java 11 и поддержки HTTP/2 до технических основ и проблем внедрения HTTP/3.

Episode 47 “Carrier Classes” [IJN] — подкаст о планах по улучшению возможностей работы с данными в Java через введение carrier classes — обобщения records. В выпуске обсуждаются особенности carrier classes и их отличия от records, а еще упоминаются carrier interfaces и другие связанные темы, например pattern assignments и constant patterns.

Podlodka #464 — Хэш-таблицы выпуск посвящен одной из самых распространенных структур данных — хэш-таблицам. В гостях Андрей Аксенов — автор поискового движка Sphinx. В выпуске освещается, нужно ли писать свою реализацию хэш-функции (скорее всего, нет), какие есть подходы к реализации хэш-таблиц — Open addressing и Buckets, когда вообще возникает необходимость писать свою реализацию и на что стоит обратить внимание.

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

How I estimate work as a staff software engineer. Автор делится своим подходом к оценке задач в роли staff-инженера. Он объясняет, что точные сроки в разработке почти всегда иллюзорны, потому что основная неопределенность скрыта в деталях, которые проявляются только в процессе работы.

Вместо схемы «понять объем работы — дать оценку» автор предлагает действовать наоборот: сначала получить ориентир по срокам, а затем определить, какую работу команда сможет выполнить в этих рамках. В такой модели инициатива по определению сроков лежит на менеджменте, а в ответ возвращаются не абстрактные числа, а варианты реализации с описанием рисков и компромиссов.

Java has evolved. Your code can too. Прикольный сайт, где можно посмотреть, как использовать новый синтаксический сахар в проектах на примерах со старыми и новыми стилями в Java. На сайте 112 примеров современных паттернов Java-кода, которые заменяют устаревшие подходы.

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

💡 27—28 февраля прошел SnowOne 2026три трека и 19 докладов. От Т-Банка выступили шесть спикеров 👍 

💡 По графику выпуска JDK 26 главный архитектор Java Platform Group в Oracle, официально объявил, что JDK 26 перешел в стадию 2RC. Финальный релиз (GA) запланирован на 17 марта 2026 года и будет включать 10 функций:

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

Второй milestone-релиз Spring Boot 4.1.0 включает исправления ошибок, улучшения документации, обновления зависимостей и новые возможности:

  • возможность указывать кодировку символов в свойстве spring.config.import при импорте конфигурационных файлов;

  • добавление атрибутов uptime, startTime, currentTime, timezone, locale и workingDirectory в класс ProcessInfo для расширения информации, предоставляемой endpoint’ом /actuator/info.

Подробности доступны в release notes и на wiki-странице релиза


Вышел четвертый maintenance-релиз Spring Framework 7.0.4 с исправлениями ошибок, обновлениями документации и новыми возможностями:

  • доработаны классы MethodParameter и AnnotatedMethod для кэширования экземпляров интерфейса Java Annotation и получения возвращаемых значений в локальный массив;

  • добавлены новой перегруженной версии метода requiredBody() в интерфейс RestClient.ResponseSpec, который теперь гарантирует ненулевое значение для соответствия существующему Kotlin-расширению.

Подробности — в release notes.


Релиз Quarkus 3.32 не отстает от своего старшего брата и несет исправления ошибок, обновления зависимостей и новые возможности:

  • интеграцию с Project Leyden;

  • поддержку автоматической регистрации сервисов приложений Quarkus с использованием сервис-регистратора, например расширения SmallRye Stork;

  • корректное завершение работы (graceful shutdown), которое по возможности избегает возврата 503-х ошибок в процессе остановки приложения.

Подробности доступны в примечаниях к релизам для версии 3.32.1 и версии 3.32.0.


Micronaut объявил о релизе версии 4.10.9, основанном на Micronaut Core 4.10.6. Релиз включает исправления ошибок и патч-обновления модулей:

  • Micronaut Servlet

  • Micronaut for Spring

  • Micronaut MCP

Подробности — в примечаниях к релизу.


Вышел Hibernate Search 8.2.2.Final с рядом заметных изменений, среди которых:

  • совместимость с Hibernate ORM 7.2.4.Final;

  • использование Locale.ROOT при создании логгеров для предотвращения лишних обращений к классам;

  • исправление проблемы, при которой документ обновлялся вместо удаления во время каскадного удаления при использовании OneToOne.

Советуем обновиться. Дополнительные подробности — в release notes.


Состоялся релиз LangChain4j 1.11.0.

Версия включает исправления ошибок и новый фичи, среди которых:

  • поддержка streaming-агентов через интерфейс TokenStream;

  • возможность отслеживать tool executions агентами при использовании экземпляра класса AiServices.

Подробности доступны в release notes.


Вышел первый релиз-кандидат Gradle 9.4.0.

В релиз вошли:

  • поддержка предстоящего выпуска JDK 26;

  • улучшения в области запуска и отчетности тестов, включая возможность использования собственной реализации интерфейса TestEngine, где обнаружение и выполнение тестов больше не обязаны быть определены исключительно в классах;

  • улучшения в configuration report: при использовании нескольких лямбда-выражений теперь можно явно указывать соответствие каждой лямбды с соответствующим типом действия.

Дополнительные подробности доступны в release notes.

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

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