
Всем привет! ?????Мы — Java-разработчики Т-Банка: Андрей, Арсений, Роман, Константин и Константин. Собираем интересные новости, статьи, туториалы и другие материалы из мира Java-разработки и делимся этим со всем сообществом.
В этом выпуске о том, что Java наконец-то делает шаг в будущее: value-классы впервые выходят в preview, а в JDK 27 по умолчанию включаются компактные заголовки объектов и G1. Наблюдаем сдвиг платформы в сторону производительности, безопасности и удобства.
Главные новости
? JDK 27 вошел в Rampdown Phase One — состав релиза заморожен 4 июня JDK 27 форкнулся в отдельную ветку и вошел в Rampdown Phase One: набор фич зафиксирован, новые JEP больше не добавляются, GA намечен на 15 сентября 2026. Из финальных (не превью) фич, наиболее интересные:
JEP 534: Compact Object Headers by Default — заголовок объекта ужимается с 96 до 64 бит на 64-битных платформах. Это прямая экономия heap (обычно 10—20%) без единой правки в коде. В JDK 24—26 фича была экспериментальной, а в 27 включается по умолчанию.
JEP 523: Make G1 the Default GC — G1 становится сборщиком мусора по умолчанию во всех окружениях (не только серверных).
А еще: JEP 527:Post-Quantum Hybrid Key Exchange для TLS 1.3, JEP 536: JFR In-Process Data Redaction и JEP 538: PEM Encodings. Продолжают дозревать в превью Structured Concurrency (7th), Primitive Types in Patterns (5th), Lazy Constants (3rd) и Vector API (12th incubator).
?JEP 401 Value Classes and Objects выйдет в Java 28 в Preview Это не учения! Проект Valhalla наконец-то начинает выходить. Кратко напомним: особенности value-классов и объектов — неизменяемость и у объектов нет identity. Из этого есть два следствия:
Сравнение объектов через == идет по значению, а не по ссылке в куче. То есть если создать два value-объекта с одинаковыми полями, то сравнение через == будет true.
Нельзя использовать synchronized. Синхронизироваться не на чем.
Эти особенности позволяют JVM более оптимально работать с value-объектами. Команда Spring АйО выпустила перевод статьи, в которой подробно рассказывается об этом JEP.
Интересные видео
? Java — Better Tools for Immutable Data. Доклад об экосистеме инструментов для работы с неизменяемыми данными: records и record patterns, derived record creation, value-классы, гибкие тела конструкторов с ранней инициализацией полей, Lazy Constants API и намек на будущие immutable arrays.
? JavaNext Language Features. Доклад-сводка недавних изменений языка и взгляд вперед — на фичи, которые сейчас в разработке для будущих релизов. Эволюция языка как она есть. Рекомендуем посмотреть.
Полезные статьи
? Performance Improvements in JDK 26. Большой обзор по четырем направлениям: библиотеки, GC, компилятор, рантайм. Среди интересного — двойные card tables в G1 (+5—15% throughput на reference-heavy нагрузках), AOT-кэширование теперь работает с любым GC (включая ZGC), размонтирование виртуальных потоков во время ожидания инициализации классов. Хороший аргумент «почему стоит перейти на 26-ю Java».
? Simplifying Weak Reference Processing in ZGC. Пост по магистерской работе с GC-командой Oracle: как снизить накладные расходы на обработку weak references в generational ZGC. Самое интересное: предложение языковой конструкции @weak (вместо объектов WeakReference). В основном бенчмарке это дало −53% по памяти и −41% по времени major-сборок.
? Exploiting GPU Tensor Cores from Java using Babylon. Автор показывает, как в рамках Project Babylon модель программирования HAT расширяет API для явной работы с GPU Tensor Cores прямо из Java. Рокет-сайенс про то, как code reflection открывает путь к высокопроизводительным вычислениям и ML-нагрузкам на акселераторах с использованием из Java.
? Jurassic JDK: Migrate or Extinct. Практический разбор миграции с легаси-JDK (вплоть до JDK 7) на современные LTS: почему оставаться на старом — больший риск, чем мигрировать, и как делать это поэтапно. Полезен инструментами (OpenRewrite, jdeprscan) и трезвой оценкой времени по трудозатратам.
? Java Annotated Monthly — June 2026 (JetBrains). Ежемесячный дайджест JetBrains: превью JDK 27 (Primitive Types in Patterns 5th preview, Structured Concurrency 7th preview), FFM API и подборка по AI-assisted разработке.
? Tool Calling in Spring AI 2.0: A Composable, Agentic Architecture. В статье команда Spring показывает, как изменился Tool Calling в Spring AI 2.0. Теперь вызов инструментов стал более гибким: можно легко встроить свою логику, менять отдельные этапы обработки и собирать более сложных AI-агентов без жесткой привязки к конкретной модели.
? Hibernate 7.4 New Features — The JetBrains Blog. Hibernate 7.4 получил два долгожданных нововведения: встроенную поддержку audit-таблиц без Hibernate Envers и поддержку пагинации вместе с join fetch. Пагинация была и раньше, но выполнялась полностью в памяти приложения, что могло приводить к неожиданным OOM. Теперь же hibernate выполняет пагинацию через подзапрос, к которому и применяет limit/offset. В статье подробно разбирается, как работают обе возможности и чем они могут быть полезны.
? Self-Correcting Structured Output in Spring AI 2.0. Spring AI 2.0 получил инструменты для более надежной работы со структурированными ответами. Первый инструмент — легкое API для ретраев, если модель ответила в неверном формате. Второй — поддержка API конкретных провайдеров для гарантий структурированных ответов (например? OpenAi Structured Output).
? How to Deadlock a Java ExecutorService | Mlangcs Personal Blog. Небольшая статья о том, как дедлокнуть любой ExecutorService с конечным числом потоков. Для начала автор показывает абстрактную блокировку. Блокировка сама по себе простая:
void main() { // однопоточный Executor var executor = Executors.newSingleThreadExecutor( Thread.ofPlatform().daemon().factory() ); Runnable taskT = () -> out.println("T done"); // Задача S ожидает выполнения T и кажется, что все выполнится ок Runnable taskS = () -> { CompletableFuture.runAsync(taskT, executor).join(); out.println("S done"); }; // При запуске задачи S она берет единственный поток // Внутри S пытается запуститься T // Но единственный поток Executor уже занят S, которая ждет T, а T ждет, когда S отдаст поток // Поздравляю, у нас дедлок CompletableFuture.runAsync(taskS, executor).join(); }
Такая блокировка легко масштабируется для случая, когда потоков больше одного. Можно создать цепь таких задач в цикле — и вот уже лежит пул на 4, 5 и так далее потоков, каждый из которых ждет поток. Самое простое решение подобной блокировки — добавить потоков или виртуальных потоков. Но правильно будет найти причину в коде и по возможности устранить ее.
А в конце статьи — плотный бонус, блокировка настолько простая и выдуманная на первый взгляд, что кажется, что в нее не попасть. Автор прикрепил реальный код с которым столкнулся при работе над more-log4j2.
? Одна маленькая ошибка в дизайне Java API, за которую потом приходится платить очень дорого. В статье освещается проблема доступа к модификации внутреннего состояния объекта вне этого объекта. Приводится пример с API кэша — метод, который возвращает ссылку на внутреннюю Map, в которой и содержатся данные.
Автор поясняет, к каким последствиям может привести ситуация как с точки зрения дальнейшей поддержки и развития API, так и с точки зрения безопасности.
Предлагается два варианта решения:
Возвращать копию объекта. Но это может привести к излишнему расходу памяти, если данных много.
Возвращать иммутабельную обертку. Тут проблема, что для клиента не очевидно, что он получит исключение при попытке изменить объект, но это можно покрыть тестами.
? Когда Hibernate плевать на ваш OneToOne Lazy Loading. В статье Михаил Поливаха объясняет, как именно устроен Lazy Loading в Hibernate и почему в случае OneToOne он не работает в конкретном кейсе. Речь идет о ситуации, когда у таблицы нет внешнего ключа.
Приводится пример с таблицами user и passport. У сущности User в соответствующей таблице есть passport_id, поэтому Hibernate может легко создать прокси, заполнив идентификатор. Но в таблице passport нет user_id, поэтому для сущности passport, чтобы построить proxy, нужно сходить в таблицу user, найти соответствующую запись по passport_id и получить из нее идентификатор пользователя. А это уже по определению не ленивая операция.
? Spring Boot Migration and the CRA: When Good Enough Isn’t. Текст о миграции со Spring Boot 3.5 и о том, почему старые версии нельзя бесконечно прикрывать фразой «зато все стабильно». После EOL главная боль не в номере версии, а в уязвимостях: если что-то всплывет, нормального патча может просто не быть. Тогда апгрейд из спокойной технической задачи превращается в срочный пожар с ИБ, аудитами и вопросами от бизнеса. Лучше обновляться планово, чем потом делать то же самое ночью и с красными глазами.
? Can Java Microservices Be As Fast As Go? A 2026 Benchmark Update. Авторы вернулись к старому спору «Java против Go» и обновили сравнение микросервисов под реалии 2026 года. Самое приятное, что это не очередная религиозная война в стиле «мой язык быстрее твоего», а аккуратная попытка посмотреть, что происходит при разных payload size и concurrency. Вывод ожидаемо скучный, но полезный: современная Java при нормальной реализации уже давно не выглядит как тяжелый энтерпрайзный динозавр, а спорить стоит не про язык, а про конкретный стек, нагрузку и цену поддержки.
? Hardwood 1.0: быстрый и легкий Parquet reader для JVM. Вышел Hardwood 1.0.0.Final — JVM-библиотека для чтения Apache Parquet с фокусом на минимальные зависимости и производительность. Интересно здесь не только «еще один reader для Parquet», а сам вектор: Java все активнее забирается в data engineering-нишу, где раньше по умолчанию ожидались Python, Scala и нативные тулзы. В текущем виде Hardwood умеет читать Parquet, поставляется как библиотека и CLI, а в roadmap уже есть writer и дальнейшее развитие вокруг columnar/data lake форматов.
Любопытные подкасты
?️ Inside Java Podcast #60: How JEPs Drive Java's Evolution [Ask the Architects]. Архитекторы Java объясняют, как именно JDK Enhancement Proposals формируют развитие платформы. Полезно для понимания «кухни» принятия решений в OpenJDK.
?️ Foojay Podcast #99: Testing the Untestable — LLM Security for Java Developers. Разбор Tiberius — open-source-библиотеки для security-тестирования LLM-приложений на Java. Обсуждают, почему привычный unit-тестинг ломается, когда недетерминизм заложен в дизайн. На стыке двух горячих тем: Java + AI/LLM.
Просто интересное
? Endive 1.0: WebAssembly on the JVM, Now a Bytecode Alliance Project. Endive 1.0 теперь входит в Bytecode Alliance. Если коротко, это WebAssembly-рантайм на Java: добавляете зависимость из Maven Central и запускаете Wasm-модули внутри JVM без JNI и нативных бинарников. Меньше боли с платформами, сборкой и деплоем.
В релизе отдельно отмечают работу WasmGC вместе с Java GC: объекты между Wasm и Java живут в обычном heap и собираются стандартным сборщиком. Пока это скорее технология «посмотреть и запомнить», чем то, что срочно нужно тащить в прод, но направление интересное.
? Vibe Coder vs Software Engineer | Yusuf Aytas. Большая хорошая статья про отличие инженера от вайб-кодера. В ней нет банального «вайб-кодинг это плохо не делайте так», автор проводит четкую границу, когда вайб-кодинг может быть полезен.
По утверждению автора, вайб-кодинг хорош, когда нужно быстро проверить идею и написать код. Но промышленная разработка — это не просто написать код, это контроль за каждое принятое решение при написании кода, при его проверке, при его эксплуатации. Инженер несет ответственность за каждую строчку кода, не важно — написана она или сгенерирована. Из этого следует еще одна важная мысль: если результат — это не сам код, то мерить нужно не время, за которое модель сгенерировала код, а время, за которое произошло безопасное слияние этого кода в кодовую базу.
? We Will Not Sabotage Your Code. Реакция на инцидент, когда мейнтейнер встроил в open-source-фреймворк скрытые промпты для саботажа AI-агентов и уничтожения данных. Поднимает острую тему доверия в open source и использования зависимостей в качестве оружия в эпоху AI.
? A2A Java SDK 1.0.0.Final Released. Первый GA официального Java SDK для протокола A2A (Agent-to-Agent). На фоне взрывного роста агентных систем у Java наконец появился стандартный способ взаимодействия агентов между собой.
? Introducing Quarkus Data: One Gateway for Data Access. Анонс Panache Next под новым именем Quarkus Data — единая точка входа для доступа к данным, призванная устранить путаницу между разными расширениями персистентности. Стратегический шаг Quarkus к унификации вокруг работы с БД.
? From Silos to Service Topology: Why Netflix Built a Real-Time Service Map. Netflix рассказывает, как они построили Service Topology — карту зависимостей между тысячами микросервисов в реальном времени. Она собирается на основе данных сети, межсервисного взаимодействия и распределенного трейсинга, что упрощает поиск проблем и понимание связей между сервисами.
? How to Build a Production-Safe Agent Loop: From Exit Conditions to Audit Trails. В туториале автор рассказывает о своей python-библиотеке production-safe-agent-loop. Она предназначена для реализации цикла работы с ИИ-агентами так, чтобы не допустить неконтролируемого перерасхода токенов и, соответственно, бюджета.
Предлагается организовывать цикл в пять фаз:
Спецификация результата. Путем ответа на три вопроса максимально четко и конкретно дать понять агенту, что будет являться результатом его работы.
CircuitBreaker. Определить лимиты по количеству шагов и токенам, которые можно потратить на решение задачи.
Журналирование. Запись в БД всей информации о процессе.
Вызов модели.
Ревью результата. Человек обязательно должен посмотреть результат.
Джавовые события
JVM Day — 29 августа, Москва, штаб-квартира Т-Банка. Вас ждут доклад про Loom, автоматизация миграций через OpenRewrite и еще много интересного.
SpringOne (в рамках конференции VMware Explore) — пройдет с 31 августа по 3 сентября 2026 в Лас-Вегасе. Главное событие экосистемы Spring. Анонсы будущего Spring Boot / Spring Framework, сессии по cloud и enterprise-Java.
Свежие релизы
Spring Boot 4.1 Adds gRPC Auto-Configuration, SSRF Mitigation, and Kotlin 2.3 Support — InfoQ. Статья от InfoQ, в которой разбираются основные изменения в вышедшем 10 июня Spring Boot 4.1. Из важных:
Автоконфигурация Spring gRPC теперь часть Spring Boot. Это изменение должно было произойти еще в Spring Boot 4.0, но не успели.
@Async-методы теперь автоматически пропагируют контекст micrometer в дочерние треды.
Возможность ввести white- и black-листы для http-клиентов с целью защиты от SSRF.
Quarkus 3.37. Релиз с новой моделью «модульности на основе расширений»: приложение собирается из явно объявленных модулей-расширений, что упрощает оптимизацию сборки и нативную компиляцию. Внутри обновление до Hibernate ORM 7.4, reflection-free-сериализаторы Jackson по умолчанию (меньше рефлексии — быстрее старт и дружелюбнее к GraalVM) и стриминг метаданных ответа в REST Client.
Hibernate ORM 8.0.0.Beta1. Первая бета следующей мажорной ветки ORM. Ключевое: переход на Jakarta Persistence 4.0 (новый baseline спецификации JPA), что задает фундамент для всей экосистемы под Jakarta EE 12. Хороший момент начать пробовать на тестовых проектах и заранее оценить объем миграции с 7.x.
IntelliJ IDEA 2026.1.3. Третий багфикс-апдейт ветки 2026.1: правки рендеринга курсора в терминале под tmux, превью изображений в Markdown, цветов в окне Database и интеграции с WSL. Параллельно открылся EAP 2026.2 — можно заранее пощупать, что приедет в следующем большом релизе.
Gradle 9.6.0 и 9.6.1: меньше боли в CI и подготовка к Gradle 10. Вышел Gradle 9.6.0, а следом быстро приехал 9.6.1 с исправлениями, поэтому смотреть лучше сразу на patch-релиз. Это не тот случай, когда в релизе появляется одна большая фича, после которой все бегут обновляться. Скорее Gradle аккуратно допиливает вещи, которые каждый день бесят в больших проектах и CI.
Из основного:
улучшили работу Configuration Cache с параметрами из system properties и environment variables;
добавили режим --non-interactive для CI и скриптов;
добавили поддержку NO_COLOR, чтобы в логах было меньше мусора от ANSI-кодов;
сделали сортировку в HTML-отчетах по тестам;
в 9.6.1 закрыли несколько багов, включая потенциальный дедлок в DefaultBuildOperationQueue.
Подробнее
Главное изменение касается Configuration Cache — механизма, который позволяет Gradle не конфигурировать проект заново при каждом запуске сборки. На маленьком проекте разница может быть почти незаметна, а вот в большом многомодульном проекте лишняя конфигурация легко превращается в минуты ожидания.
В 9.6 Gradle лучше работает с параметрами, которые часто прилетают из CI через system properties и environment variables: номер билда, ветка, окружение, флаги и прочая служебная информация. Раньше из-за таких вещей кэш мог сбрасываться чаще, чем хотелось бы. Теперь Gradle точнее понимает, что реально влияет на сборку, а что нет.
Режим --non-interactive тоже выглядит мелко только на бумаге. В CI сборка не должна внезапно ждать ответа пользователя там, где пользователя вообще нет. Для локального запуска это может быть нестрашно, а в пайплайне превращается в зависание до таймаута.
NO_COLOR пригодится тем, кто устал смотреть на кашу из ANSI-кодов в логах сборки. А сортировка в HTML-отчетах по тестам помогает быстрее найти, например, самые долгие или падающие тесты.
Отдельно стоит отметить 9.6.1: он чинит несколько неприятных проблем первого релиза, включая потенциальный дедлок в DefaultBuildOperationQueue. Поэтому если обновляться, то лучше сразу на 9.6.1.
Спасибо за прочтение! Ждем обратную связь в комментариях. Увидимся через месяц ?
Присылайте материалы, если встретили что-то интересное, — опубликуем в следующем выпуске!