Всем привет! ????? Мы — 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.

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

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

Комментарии (2)


  1. SaNNy32
    07.03.2026 04:41

    Мы, разработчики Т-Банка…
    Мы, разработчики Т-Банка…

    Как я это вижу :)


  1. akardapolov
    07.03.2026 04:41

    Плюс у нас есть проект Panama, который нацелен на интеграцию Java с не Java, — кажется, что логичнее увидеть его расширение.

    Detroit не конкурирует с Panama, он строится на Panama и планирует её развивать через вызов FFM API и далее CPython через который получаем доступ ко всей Python-экосистеме (AI).

    We expect to leverage and push the boundaries of the FFM API, so this work will likely influence Project Panama.

    Похоже на что-то серьезное, судя по составу команды: Maurizio Cimadamore (архитектор Panama), Jorn Vernee (ключевой контрибьютор FFM API), Jim Laskey (Nashorn).

    Т.е. они пилят официальный мост к чужой экосистеме (Python (AI) + JS).

    Есть другой путь, в JVM-native делать все - вот в этой либе Rapaio Aurelian Tutuianu в одно лицо пытается соорудить паралельную историю (аналог Pytorch).

    Tensors and Neural Networks

    Starting with version 7.0.0 this library contains the concept of differentiable multidimensional array. The name of this object is a tensor, in order to maintain the tradition of well established libraries. The same libraries are the inspiration for this implementation, especially Pytorch. As such, we tried to maintain a similar syntax, although there are some conceptual differences.