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

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

Октябрь выдался интересным: JDK 26 приносит поддержку HTTP/3, Vector API снова в инкубации, а Swing внезапно обзаводится своим DatePicker — да, 2025-й, а Swing жив! Разработчики обсуждают Leyden и GPU-ускорение для Java-ИИ, а Oracle чинит 15 уязвимостей. В статьях свежие оптимизации ZGC, разбор виртуальных потоков, Jackson 3, Kafka Queues и немного философии про «хороший вкус» в разработке. А под конец релизы, от JUnit 6 до Spring 6.2.12. Заваривайте кофе, обновляйтесь до JDK 25 и читайте. Поехали ?

Горячие JEPы

JEP 529: Vector API (Eleventh Incubator). Предлагает очередной раунд инкубации для Vector API, которое позволяет реализовывать в Java векторные вычисления, например SIMD. JEP рассчитывает, что эти вычисления на целевых архитектурах (x64, AArch64) будут компилироваться в оптимальные машинные векторные инструкции.

JEP draft: JEP: Add a JDatePicker UI Component to the Swing UI Toolkit (Preview).

Добавляет новый стандартный Swing-компонент JDatePicker (в пакете javax.swing) — это виджет для выбора даты или диапазона дат из календаря плюс поле ввода. В Swing отсутствует собственный компонент Picker-дат, многие приложения используют сторонние библиотеки, а наличие встроенного компонента упростит разработку GUI на Java.

Роман Краснослабодцев

Да, Swing развивается. Нет, это не шутка. Да, 2025-й на дворе.

JEP направлен в JDK 26: 517: HTTP/3 for the HTTP Client API. Обновленный клиент для поддержки HTTP/3 с минимальным изменением кода.

Арсений Зайцев

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

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

В октябрьском обновлении безопасности Oracle (CPU October 2025) для платформы Java SE устранено 15 уязвимостей, из которых 11 могут быть эксплуатированы удаленно без аутентификации. 

Обновления затронули Java 8 u441, Java 11.0.26, Java 17.0.14, Java 21.0.6 и Java 25.0.1, устранив проблемы в компонентах Hotspot, JSSE, Libraries и JNDI. Oracle настоятельно рекомендует всем пользователям обновить JDK и JRE до последних сборок, особенно на серверах с открытым сетевым доступом.

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

G1 GC: 3 Upcoming Improvements - Inside Java Newscast #99 В очень осеннем и дождливом выпуске Николай рассказывает о трех JEPs, касающихся сборщика мусора G1:

  • JEP 522: G1 GC: Improve Throughput by Reducing Synchronization. Сократилось количество синхронизаций между тредами G1 и самого приложения, что благотворно повлияет на утилизацию процессора.

  • JEP 523: Make G1 the Default Garbage Collector in All. Теперь G1 будет сборщиком мусора по умолчанию во всех случаях. Ранее для некоторых конфигураций среды мог выбираться Serial GC.

  • JEP draft: Automatic Heap Sizing for G1. Появится автоматическое управление размером хипа, если пользователь явно не задаст соответствующие флаги. То есть размер хипа будет меняться в пределах доступной RAM. Кстати, для ZGC такой JEP тоже есть.

Петр Портнов — Обновляться больно. Обновляйтесь В докладе Петр рассматривает две темы. 

Первая — менеджмент зависимостей сторонних библиотек. Автор на примере конфликта мажорных версий v3 и v4 библиотек для работы с Protobuf рассказывает, что можно сделать, чтобы снизить вероятность подобных конфликтов и как проще обновляться на новую мажорную версию. Особенно когда мы имеем дело с системой, поделенной на множество микросервисов. 

Вторая тема — best practices для работы с внутренними библиотеками. Как правильно предоставлять API, как их рефакторить и обновлять.

From JDK 21 to JDK 25 - Java Performance Update 2025 От JDK 21 до JDK 25 — заметные приросты производительности «из коробки» благодаря generational ZGC, компактным заголовкам объектов, автовекторизации SIMD, Leyden (ускорение старта/прогрева), FFM/JExtract, Stable Values и улучшениям виртуальных потоков. Стоит посмотреть доклад, чтобы понять, как корректно измерять и извлекать эти выигрыши в проде, какие фичи и тюнинги включать сейчас и что придет дальше (Valhalla, дальнейшие ускорения Leyden и Panama).

Assembling Project Leyden #JVMLS Проект Leyden — системный подход в JDK 24/25 к ускорению запуска и прогрева Java‑приложений: тренировочные запуски, сохранение профилей и зависимостей, предварительная загрузка или связывание классов и надежный AOT‑кэш. 

Стоит посмотреть, если важен быстрый старт микросервисов, CLI или десктопа и хочется понять, что дает ~2× ускорение в JDK 24, что придет в JDK 25 (профили методов) и как избежать ловушек состояния или инициализации классов и переносимости при сборке.

Writing GPU-Ready AI Models in Pure Java with Babylon Как на чистой Java запускать и разрабатывать GPU‑ready-модели ИИ: через ONNX Runtime (Panama/JExtract), Project Babylon и Hat для генерации GPU‑ядер. Стоит смотреть доклад, если хочется быстро добавить ускорение (GPU/NPU) в свои Java‑приложения без ухода в C или Python: показаны живые демо, конкретные шаги по сборке и понятная дорожная карта Java для AI.

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

Виртуальные потоки в Java: эволюция, практика, подводные камни. Автор дает очень хорошую и понятную сводку по текущему состоянию виртуальных потоков. Обозначает, какую проблему они решают, когда их лучше всего применять, какие были проблемы в Java 21 и как их решили к 25-й версии. 

Investigating The Smells of LLM Generated Code. Авторы исследуют чистоту и поддерживаемость генерируемого Java-кода. Они измеряли наличие code smells (плохих практик, потенциальных проблем) в Java-коде, сгенерированном такими инструментами, как ChatGPT, Gemini Pro и Falcon, и сравнивали с эталонным кодом, написанным профессионалами. Общий вывод: LLM-код значительно «грязнее»: в среднем на ~63% больше smells по сравнению с человеческим.

FreshBrew: A Benchmark for Evaluating AI Agents on Java Code Migration. Исследование представляет FreshBrew — набор критериев и задач для оценки ИИ-агентов по переносу (миграции) кода на Java на уровне проекта: например, обновление кода с одной версии JDK или библиотеки на другую. Авторы подчеркивают, что для надежной оценки важно сохранять семантику программы и не позволять агенту «подделывать» результат (reward hacking).

HTTP/3 Support in JDK 26. Статья рассказывает о внедрении поддержки протокола HTTP/3 в HttpClient начиная с JDK 26. Несмотря на то, что API почти никак не изменилось, в статье подчеркивается, что внедрение поддержки заняло несколько лет, в том числе из-за использования QUIC в качестве транспортного протокола для HTTP/3.

Introducing Jackson 3 support in Spring. Начиная с Spring 7 появляется поддержка Jackson 3, а поддержка Jackson 2 переходит в статус deprecated for removal. Хотя им все еще можно пользоваться для упрощения миграции на новый Spring. Важные изменения с точки зрения Spring: 

  • замена ObjectMapper на иммутабельный JsonMapper; 

  • использование JacksonJsonHttpMessageConverter (с поддержкой хинтов сериализации) вместо MappingJackson2HttpMessageConverter.

Подробности об изменениях в Jackson 3 можно прочитать в блоке со свежими релизами ?

Introducing Share Consumer Support (Kafka Queues) in Spring for Apache Kafka. Начиная с Spring 7 в Spring Kafka появится поддержка новой фичи Kafka — share groups, также известных как Kafka Queues. Основное отличие share groups от всем известных consumer groups заключается в том, что консьюмеров может быть больше, чем партиций, а разные консьюмеры могут читать параллельно сообщения из одной и той же партиции.

Сама фича все еще не считается production-ready: с выходом Kafka 4.1 она перешла в preview-статус и планирует достигнуть GA в версии 4.2 (выход которой запланирован на январь 2026 года). 

Прочитать подробности о Kafka Queues и концепции share groups можно в KIP-932.

Transactions and ThreadLocal in Spring. Небольшая статья о том, как и для чего транзакции Spring используют ThreadLocal и TransactionSynchronizationManager для управления транзакциями в многопоточном приложении. Затрагивается то, как все это работает в реактивных приложениях, где ThreadLocal не работает.

NUMA-Aware Relocation in ZGC. Статья описывает функцию NUMA-aware relocation в ZGC (сборщик мусора в OpenJDK), которая будет доступна в JDK 26. Функция улучшает поддержку NUMA, сохраняя объекты ближе к использующим их потокам и повышая производительность приложений. Рассмотрены интеграция NUMA в фазу релокации ZGC, решаемые проблемы, ограничения и будущие улучшения. 

Performance Improvements in JDK 25. Статья описывает ключевые улучшения производительности в JDK 25. Читатели узнают о нововведениях в библиотеках JDK, сборщиках мусора, компиляторе и рантайме, например о финализации API Scoped Values, оптимизации строк и Stable Values (Preview). Материал будет полезен разработчикам, желающим понять преимущества JDK 25 для своих приложений.

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

Мне жаль, но вы используете подсветку кода неправильно. Блин, я хоть что-то в этой жизни делаю правильно?! ? Перевод статьи I am sorry, but everyone is getting syntax highlighting wrong. Автор делится мыслями о том, как настроить подсветку синтаксиса так, чтобы она стала максимально эффективной и помогала читать и понимать код быстрее, уменьшая когнитивную нагрузку. 

Суть в том, что выделять нужно то, чего не так много. Это константы, комментарии, объявление (только объявление, а не использование) функций, классов и переменных. За счет этого код ощущается более чистым и лаконичным. Рекомендуем попробовать.

Мнение, Константин: Такой подход очень хорошо подойдет, если хорошо знаешь язык — его синтаксис и ключевые слова. В то же время, если ты новичок, есть опасность, что тебе, напротив, будет сложнее ориентироваться.

Что значит «хороший вкус» в разработке ПО? Перевод статьи What is "good taste" in software engineering?. По сути, автор говорит о гибкости в принятии решений. Не существует подходов, которые в 100% случаев приведут к успеху. Всегда нужно учитывать контекст, в котором работаешь. Контекст включает в себя нужды и приоритеты заказчика, нефункциональные требования к системе, уровень подготовки команды, с которой вы работаете, а также множество других факторов. Именно поэтому догматическое мышление крайне неэффективно и, вероятнее всего, приведет к провалу.

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

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

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

Devoxx Belgium 2025. 6—10 октября в Бельгии прошла очередная конференция Devoxx. На официальном канале Java появился плейлист с записями некоторых докладов и QA-сессий — Devoxx Belgium 2025 - YouTube. Помимо докладов, упомянутых тут, рекомендуем посмотреть доклад Nicolay Parlog - Structured Concurrency In Action в формате лайв-кодинга.

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

Вышло несколько новых версий Kora фреймворка, включая крупные обновления 1.2.0 вплоть до 1.2.4. В этих версиях реализовано множество важных улучшений, направленных на повышение стабильности, производительности и удобства разработки.

Появилась поддержка виртуальных потоков (Virtual Threads). Начиная с версии 1.2.0 HTTP-сервер на базе Undertow получил поддержку виртуальных потоков — мощного нововведения из Project Loom. Это позволяет эффективно обрабатывать тысячи одновременных запросов с минимальными накладными расходами, значительно повышая пропускную способность приложений.

Улучшения в OpenAPI-генераторе. В нескольких версиях (особенно в 1.2.0—1.2.4) проведена масштабная работа над генератором OpenAPI:

  • Добавлена опция forceIncludeOptional для контроля @JsonInclude(ALWAYS) в Kotlin.

  • Исправлены ошибки генерации полей byte[], discriminator, nullable и валидации вложенных моделей.

  • Улучшена обработка Form-параметров и префиксов аннотаций в Kotlin.

  • Добавлена опция forceIncludeNonRequired — больше гибкости при описании API.

Расширение возможностей Kafka и телеметрии:

  • Добавлена поддержка KafkaSkipRecordException — теперь можно корректно пропускать проблемные записи без падения потребителя.

  • Улучшены метрики и логирование для @KafkaListener и @KafkaProducer, добавлена телеметрия контекста.

  • Исправлено поведение KafkaAssignConsumer при обновлении графа.

Улучшения в тестировании и DI:

  • Поддержка Mockito-сессий и проверка неиспользуемых моков в JUnit 5.

  • Исправлен конфликт системных свойств при инициализации нескольких графов приложения в тестах параллельно.

  • Добавлена возможность передачи Map системных свойств в KoraConfigModification.

Маскирование заголовков Cookie/Set-Cookie по умолчанию — безопасность «из коробки».

Добавлены конфигураторы тегов метрик для HTTP и gRPC.

Улучшено поведение CircuitBreaker, Retry и Fallback: исправлены ошибки в режимах HALF_OPEN и disabledи обработке исключений.

? Что еще важно?

Инкрементальная обработка теперь полностью поддерживается на уровне Gradle и KSP — быстрее сборка и разработка.

Почти все зависимости обновлены до последних версий, улучшены сообщения об ошибках, особенно в UnresolvedDependencyException — проще отлаживать DI.


Jackson Release 3.0

Jackson обновился до версии 3.0. Из основных нововведений:

  • Java 17 как новый baseline.

  • Модули Java 8 (для поддержки java.time, и Optional) больше не нужны, теперь все это поддерживается из коробки (ура!).

  • Иммутабельные сущности: специфические JsonMapper, XmlMapper и другие вместо ObjectMapper.

  • Переименовали большого числа сущностей. Например, JsonProcessingException стал JacksonException, а JsonFactory превратился в TokenStreamFactory. Причина проста: названия были придуманы в версии 1.0, когда Jackson умел работать только с json. Сейчас же это может вводить в заблуждение.


Команда JUnit выпустила версию 6.0.0: 

  • Базовая версия Java поднята до 17 (для Kotlin — 2.2). 

  • Появились нативные suspend-тесты без runBlocking. 

  • Новый CancellationToken и флаг --fail-fast в ConsoleLauncher.

  • Повсеместно добавлены аннотации JSpecify для null-контрактов. 

  • Сменили CSV-провайдер на FastCSV. 

  • Стало явным упорядочивание тестов и классов. 

  • Убрали JUnit 4 runner.

  • Vintage помечен deprecated.


Релиз Testcontainers 2.0.0 включает исправления ошибок, обновление зависимостей и несколько новых возможностей, таких как реализация метода getHttpUrl для ClickHouseContainer и возможность экспорта gRPC-ендпоинта из BigQueryEmulator. Подробности в release notes.


Вышел релиз WildFly 38.0.0 Final и WildFly Preview 38.0.0 — сервер обновился до MicroProfile 7.1, включая OpenAPI 4.1 и Telemetry 2.1. Добавили поддержку инъекций EntityManagerчерез @Inject (в Preview), переработали документацию и каталог feature-packs. Основная версия остается на Jakarta EE 10 (Java 17/21), а Preview уже частично реализует Jakarta EE 11 Core Profile.


Вышел патч для GraalVM 25.0.1, набор security-фиксов и багфиксов (по мотивам CPU Oracle). Также компилятор Graal получил оптимизации для Vector API и оптимизацию узких мест в JIT. В Native Image улучшен анализ зависимостей, сокращен размер итоговых бинарников и добавлены новые параметры сборки.


Релиз Spring Framework v6.2.12 несет сразу несколько приятных улучшений:

  • Добавлен метод forEachByte в DataBuffer для эффективной работы с байтами. 

  • Улучшена поддержка MySQL/MariaDB при генерации ключей. 

  • Оптимизировано управление состояниями в StompSubProtocolHandler. 

  • Устранены многочисленные баги. Например, неправильное поведение в DefaultListableBeanFactory и проблемы с UrlHandlerFilter. 

  • Обновились зависимости: Micrometer до версии 1.14.12 и Reactor до версии 2024.0.11.


    Спасибо за прочтение! Будем рады обратной связи в комментариях — и увидимся через месяц ?

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


  1. akardapolov
    06.11.2025 11:08

    JEP draft: JEP: Add a JDatePicker UI Component to the Swing UI Toolkit (Preview).

    JEP draft: JEP: Add a JDatePicker UI Component to the Swing UI Toolkit (Preview)
    JEP draft: JEP: Add a JDatePicker UI Component to the Swing UI Toolkit (Preview)

    Пока не впечатляет, LGoodDatePicker выглядит получше.

    The need for this in Swing was recognised a long time ago and there was a prototype in the now abandoned SwingX project. https://openjdk.org/jeps/8368874

    В части UI/UX SwingX стоит на голову выше ванильного Swing-а.