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

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

Горячие JEPы

JEP 527: Post-Quantum Hybrid Key Exchange for TLS 1.3 повышен со статуса Proposed до Targeted для JDK 27. JEP предлагает улучшить реализацию RFC Transport Layer Security (TLS) Protocol Version 1.3, используя спецификацию Hybrid Key Exchange in TLS 1.3, которую сейчас разрабатывает Internet Engineering Task Force (IETF).

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

Команда Spring обнаружила CVE-2026-22718 (Command Injection on User Machine using VSCode Extension for Spring CLI) — уязвимость, затрагивающую Spring CLI VSCode Extension версий 0.9.0 и ниже. Эта уязвимость позволяет атакующему использовать Command Injection для удаленного выполнения команд на машине пользователя. Поддержка расширения завершилась в мае 2025 года, и разработчикам следует удалить его из своих сред разработки.

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

1B Rows with the Memory API - JEP Cafe #25 В этом выпуске разработчики JEP Cafe берутся за «Челлендж в миллиард строк» и реализуют его с помощью нового Memory API из JDK 22. Цель — не побить рекорды по скорости, а показать, как можно эффективно и чисто обрабатывать бинарные данные, используя стандартные средства Java. Видео будет полезно Java-разработчикам, интересующимся низкоуровневой обработкой данных, работой с памятью вне Heap и новыми возможностями JDK 22. Можно узнать, как применять Arena, MemorySegment, MemoryLayout, VarHandles и параллельные потоки на практике, чтобы писать более производительный и безопасный код.

Carrier Classes; Beyond Records - Inside Java Newscast #105 Выпуск посвящен обсуждению новых возможностей в Java, связанных с улучшением работы с данными. Основной фокус — на концепции carrier-классов и carrier-интерфейсов, которые расширяют идею Records, предлагая гибкий способ описания данных с поддержкой паттерн-матчинга и возможности изменения состояния. Еще рассматриваются эволюционные изменения в паттернах и новые идеи, такие как Pattern Assignments и Constant Patterns. На эту тема есть прекрасная статья.

Андрей Кулешов — Не Spring'ом единым? Смотрим на Quarkus Обзорный доклад о Quarkus и экосистеме вокруг него. Рассматриваются основные идеи фреймворка, связанные с ним инструменты и подходы, включая Panache, gRPC и нативное исполнение через GraalVM. Доклад обзорный и не предполагает глубокого разбора или сравнения с привычным стеком. Материал полезен Java-разработчикам, работающим со Spring, которые хотят расширить кругозор и лучше ориентироваться в современных альтернативах внутри Java-экосистемы.

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

One Giant Leap: 95% Less Sampling Cost небольшая статья про оптимизацию сбора метрики времени использования CPU пользователем или приложением, ThreadMXBean.getCurrentThreadUserTime(), на Linux. 

Для получения данных об использовании CPU JVM читает псевдофайл из каталога /proc, ищет нужную строку и переводит ее в число. При этом из требуемых 20 байт ядро формирует псевдофайл 340 байт, размер может отличаться от системы к системе. Под псевдофайл выделяется полноценная страница памяти размером 4 КБ, что создает дополнительную нагрузку на память. Вместо этого предлагается использовать функциональность с использованием маски на идентификаторе часов, в последних 3 битах которого находится нужное значение.

Функциональность не задокументирована, но ею уже пользуется glibc, что дает уверенность что она не изменится слишком резко. Так получилось срезать косты на сбор метрики на 95%, а доработанный метод будет доступен уже в JDK 26.

Redis — это больше, чем просто кэш. Перевод статьи Redis is more than JUST a Cache. Практичная с инженерной точки зрения статья. К Redis часто относятся как к очень удобному и быстрому распределенному кэшу. Автор приводит куда больше примеров его использования: Rate Limiting, модификация состояний, хранение сессий, распределенные блокировки и даже для pub/sub-ивентов на небольших нагрузках. Использование Redis такими способами может значительно упростить архитектуру системы и повысить ее надежность. 

Flaky Tests: a journey to beat them all. Спойлер: им не удалось ?

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

Константин Максимов

Тут важно понимать вводные. В системе 6 000+ тестов, и ежедневно добавляется еще. Также много тестов работает с многопоточкой. В этом контексте подход можно считать приемлемым. Но всегда старайтесь разобраться, в чем причина флаки-теста. По моему опыту, самые частые причины — разделяемое состояние и неудачно генерируемые тестовые данные. 

Thread Dumps and Project Loom (Virtual Threads) пост от JetBrains, в котором автор кратко рассказывает о виртуальных тредах и как Intellij IDEA умеет работать с ними. В частности, отображать их для работающего приложения либо из тред-дампа, снятого другим инструментом. 

Optimizing GPU Programs from Java using Babylon and HAT. Большая статья о HAT — фреймворке параллельного программирования. Он позволяет разработчикам переносить выполнение Java-кода на современные аппаратные ускорители, такие как графические процессоры (GPU). 

Помимо обзора самого HAT в статье показано решение задачи по умножению матриц с его помощью и применение различных алгоритмов оптимизации данной задачи, что позволило приблизиться по скорости вычисления к cuBLAS. 

cuBLAS — библиотека линейной алгебры, разработанная компанией NVIDIA для запуска распространенных подпрограмм базовой линейной алгебры (BLAS) на графических процессорах NVIDIA.

The Ultimate 10 Years Java Garbage Collection Guide (2016—2026) — Choosing the Right GC for Every Workload увесистый гайд по выбору и настройке сборщиков мусора в JVM под разные типы нагрузок. Автор анализирует эволюцию GC от JDK 8 до JDK 25, сравнивает Parallel, G1, ZGC и Shenandoah. Он предлагает практическую матрицу и дерево решений, помогающее выбрать оптимальный GC под конкретные требования по задержкам, пропускной способности и ресурсам. 

[JavaSpecialists 331] — Virtual Thread States. Интересная статья с подробным разбором устройства внутренних состояний виртуальных потоков в JVM (а их целых 20!!!) и как они отображаются на привычные шесть состояний классических потоков. Показано, как с помощью рефлексии проникнуть в самые «кишки» класса VIrtualThread и получить более точное состояние виртуального потока. Помимо этого, приведены примеры поведения в разных ситуациях на Java 21—26. 

JEP 525 Brings Timeout Handling and Joiner Refinements to Java’s Structured Concurrency. Обзор нововведений в API Structured Concurrency в Java 26. Одно из главных — удобный onTimeout() callback для Joiner, позволяющий возвращать частичные результаты при таймаутах, а не выбрасывать исключения. Остальные изменения — шлифовка API: переименования методов для лучшей читаемости и изменение возвращаемых значений.

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

Options Appraisal: a Pragmatic Guide for Architecture Decisions — практическое руководство по системному принятию архитектурных решений. Статья описывает подход Options Appraisal — от формулировки целей и набора альтернатив (включая «ничего не делать») до взвешивания критериев и фиксации компромиссов. Подход подчеркивает итеративность процесса, позволяя пересматривать варианты и корректировать решения на каждом этапе. Отдельный акцент сделан на прозрачности процесса и документировании решений, чтобы в будущем было понятно, почему выбрали именно этот вариант.

Why We've Tried to Replace Developers Every Decade Since 1969 отличная ретроспектива попыток заменить программистов уже более 50 лет. Начиная c COBOL и заканчивая современными AI-ассистентами. Автор поясняет, почему разработчики все еще нужны и будут нужны всегда. Цитата: «Разработка программного обеспечения — это воплощение мышления в материальную форму». А для этого нужен человек (ну или супер-GAI ?). Каждая такая попытка приносит новые инструменты для более эффективной работы, поэтому автор приходит к парадоксальному выводу, что, возможно, повторяющиеся попытки заменить разработчиков не так уж и плохи ?

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

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

  • экземпляр DisconnectedClientHelper должен отдельно определять наличие классов RestClientException и WebClientException, поскольку второй игнорировался, если первый отсутствовал; 

  • новый класс InvocationRejectedException, добавляющий новую опцию аннотации @ConcurrencyLimit для настройки Throttle Policy. 

Подробнее — в Release Notes.

______________________________________________________

GA релиз GlassFish Grizzly 5.0.0 — фреймворка, предназначенного для расширения возможностей Java NIO API. Релиз несет заметные изменения:

  • базовую версию JDK 21; 

  • поддержку виртуальных потоков благодаря новому классу VirtualThreadExecutorService для использования в пуле потоков Grizzly; 

  • поддержку спецификации Jakarta Servlet 6.1. 

Подробнее — в Release Notes.

______________________________________________________

GraalVM 25.0.2 — второй maintenance-релиз, приуроченный к CPU Oracle за январь 2026 года. Он устраняет заметные проблемы: утечку памяти с событиями Translation-Lookaside Buffer (TLB) в JDK Flight Recorder и некорректную компиляцию при Loop Vectorization, приводившую к некорректной работе VM. Команда прекратила поддержку macOS ×64. Текущий релиз поддерживает только macOS AArch64. 

Подробнее — в Release Notes.

______________________________________________________

Payara выпустила «январское издание» Payara Platform, включающее Community Edition 7.2026.1, Enterprise Edition 6.34.0 и Enterprise Edition 5.83.0. Помимо исправлений и обновлений компонентов все три релиза фокусируются на устранении двух CVE:

  • CVE-2020-5258 — уязвимости в Dojo, позволяющей атакующему внедрять свойства в прототипы существующих конструкций языка JavaScript и манипулировать атрибутами для перезаписи;

  • уязвимости, позволяющей атакующему захватить админ-аккаунт Payara через вредоносный URL-пейлоад. 

Подробнее — в релиз-нотах для Community Edition 7.2026.1, Enterprise Edition 6.34.0 и Enterprise Edition 5.83.0.

______________________________________________________

Релиз Keycloak 26.5.0 содержит исправления, обновления зависимостей и новые возможности: 

  • preview JWT Authorization Grant — реализация спецификации JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants (RFC 7523) — для использования внешних подписанных JWT Assertions при запросе OAuth 2.0 Access Tokens; 

  • улучшения OpenTelemetry, включая экспорт логов в OpenTelemetry Collectors и экспорт метрик с использованием расширения Quarkus Micrometer and OpenTelemetry. 

Подробнее — в Release Notes.

______________________________________________________

Релиз LangChain4j 1.10.0 принес исправления, обновления зависимостей и заметные изменения: новый интерфейс AgentListener и класс AgentMonitor для добавления Observability и мониторинга для Agentic Systems. 

Подробнее — в Release Notes.

______________________________________________________

Вышел пятый maintenance-релиз Quarkus 3.30.5, в котором исправлены исчезновения Tracing-specific MDC Context при использовании интерфейса ManagedExecutor в приложении с расширениями OpenTelemetry и REST. А еще исправили исключение OutOfMemoryError при тестировании CLI-приложения, аннотированного @QuarkusMainTest, из-за роста числа загруженных классов на протяжении выполнения тестов, которые не очищались сборщиком мусора. 

Подробнее — в Release Notes.

______________________________________________________

Jakarta Persistence 4.0 Milestone 1 — вышел первый Milestone Jakarta Persistence 4.0.

Крупные изменения:

  • EntityAgent — новый интерфейс взаимодействия с БД. В отличие от EntityManager он сразу взаимодействует с БД мимо Persistence Context. Основными операциями EntityManager будут Insert, Update, Delete, Upsert.

  • @StaticQuery, @StaticNativeQuery, @ReadQueryOptions и @WriteQueryOptions — новые аннотации для написания пользовательских запросов. Эти аннотации позволят обработчикам аннотаций, таким как Hibernate, проверять запросы к БД еще на стадии компиляции.

  • В JPA 1.0 была аннотация @SqlResultSetMapping, теперь для тех же целей дополнительно будет еще и API. В зависимости от предпочитаемого подхода можно использовать API или аннотацию.

  • Вместо интерфейса Query появились Statement и TypedQuery. Statement будет использоваться для запросов, которые не возвращают результат, а TypedQuery — для запросов, которые возвращают результат.

  • Для NamedEntityGraph теперь можно указать атрибут name, @NamedEntityGraph (name = “namedGraph”), после чего этот name можно указать в NamedEntityGraphSubgraph в атрибут graph, @NamedEntityGraphSubgraph(graph = “namedGraph”), тем самым связав их.

Новые методы:

  • get() — аналогичен find(), но, если не найдет запись, вернет EntityNotFoundException;

  • findMultiple() и getMultiple() аналогичны find и get, но принимают массив идентификаторов для поиска нескольких записей;

  • getResultCount() — возвращает количество найденных записей;

  • setParameter() и setConvertedParameter() позволят четко указать тип параметра запроса.

Маленькие, но важные изменения:

  • FetchType.Lazy можно указать по умолчанию для всех запросов с помощью

    <default-to-one-fetch-type>LAZY<default-to-one-fetch-type> 

    или persistenceConfiguration.defaultToOneFetchType(FetchType.LAZY);

  • select new стал необязательным теперь можно использовать просто select;

  • @ExcludedFromVersioning позволяет изменять поля без оптимистичной проверки версии;

  • Свойства jakarta.persistence.jdbc.fetchSize и jakarta.persistence.jdbc.batchSize теперь определяются спецификацией как стандартный способ управления fetch size и batch size соответственно;

  • PessimisticLockScope.FETCHED — новая опция, которая в отличие от классического PessimisticLockScope блокирует только те строки, которые читаются запросом.

______________________________________________________

Oracle Java Extension for Visual Studio Code Version 25.0.1 доступен:

  • уточнили использование API File URI в vscode; 

  • исправили привязку контекста проекта для блокнотов на Windows;

  • улучшили интерфейс параметров рефакторинга (добавили иконки кнопок); 

  • добавили предупреждения о предупреждениях сервера языка NetBeans во время рефакторинга;

  • исправили валидирование имен классов при создании файлов из шаблона; 

  • устранили проблемы с выполнением кода в ячейках блокнота; 

  • убрали зависимость от microsoft/vscode-l10n; 

  • исправили запуск сервера языка NetBeans на Windows ARM64 с JDK ×64; 

  • обновили URL openjdk25;

  • сервер языка NetBeans теперь учитывает настройки обхода каталогов проекта при сканировании проектов Gradle;

  • обновили зависимости и удалили неиспользуемые модули.

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

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


  1. alexanderfedyukov
    07.02.2026 06:12

    Спасибо за ссылку на Optimizing GPU Programs from Java using Babylon and HAT. Кто-то пробовал этот фреймворк? Каково впечатление? Стоит следить за проектом\пробовать или это что-то похожее на aparapi и tornadovm? По описанию - перспективно, и что-то похожее должно было появиться с приходом новой модели Foreign function в виде оберток над opencl, rocm, etc.


    1. Jijiki
      07.02.2026 06:12

      1B Rows with the Memory API - JEP Cafe #25 В этом выпуске разработчики JEP Cafe берутся за «Челлендж в миллиард строк» и реализуют его с помощью нового Memory API из JDK 22. Цель — не побить рекорды по скорости, а показать, как можно эффективно и чисто обрабатывать бинарные данные, используя стандартные средства Java. Видео будет полезно Java-разработчикам, интересующимся низкоуровневой обработкой данных, работой с памятью вне Heap и новыми возможностями JDK 22. Можно узнать, как применять Arena, MemorySegment, MemoryLayout, VarHandles и параллельные потоки на практике, чтобы писать более производительный и безопасный код.

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

      тоесть я как пример, на другом языке, выделяю кусок на гпу, и кусок на цпу, для гпу обновляю в цпу потоках за счет этого производительность

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

      вы прикиньте java 25 + off-heap bounds checking без unsafe + java потоки = имба наверное