Как стать автором
Обновить
443.19

Java Digest #22

Уровень сложностиПростой
Время на прочтение10 мин
Количество просмотров2.8K

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

В этом выпуске: дикая сторона Java — неожиданные трюки, которые работают. Узнаем, как переключение контекста убивает продуктивность и как с этим бороться. Разберем третью и четвертую части серии про HotSpot C2 JIT Compiler: измерим время компиляции, оптимизируем циклы и ускорим JIT. 

Посмотрим на свежие JEP и разберемся, какие новинки ждут нас в будущих версиях Java. Погрузимся в реальные проблемы миграции баз данных: транзакционные DDL, конфликты обновлений и правильные стратегии применения изменений. А в конце — большое видео на 2,5 часа про все ключевые фичи, которые появились в Java 22 и 23. Приятного прочтения!

Горячие JEP-ы

Ahead-of-time Command Line Ergonomics. Предлагается упрощенный механизм создания AOT-кеша, позволяющий в одном запуске JVM автоматически выполнить тренировочную запись и последующую сборку кеша. Решение минимизирует необходимость использовать несколько команд запуска, упрощая процесс подготовки приложения к работе.


Automatic Heap Sizing for the Serial Garbage Collector. В рамках JEP реализована динамическая корректировка размера кучи при использовании Serial GC. Система автоматически адаптирует параметры памяти с учетом изменений нагрузки и доступных ресурсов, что позволяет снизить задержки, связанные с работой сборщика мусора, без обязательной предварительной настройки.


Cooperative JFR Sampling. Представлен механизм выборочного сбора стековых трассировок JFR, осуществляемый только в заранее определенных безопасных точках. Такой подход снижает риск возникновения сбоев, связанных с небезопасным чтением стека, и обеспечивает корректное взаимодействие с асинхронными сборщиками мусора.


Deprecate UseCompressedClassPointers for removal. JEP инициирует процесс устаревания флага UseCompressedClassPointers с последующим его удалением в будущих релизах. Это изменение направлено на оптимизацию реализации и повышение производительности за счет использования единого формата сжатых указателей для классов, что упрощает поддержку и улучшает согласованность объектного заголовка.


JEP 502: Stable Values (Preview) перешел в статус Proposed to Target и ожидается к релизу в JDK 25. Подробнее о нем мы писали в предыдущем выпуске.

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

Представлены обновления ранних сборок JDK: JDK 24 с Build 36 (release notes) и JDK 25 с Build 9 (release notes); разработчикам советуют сообщать об ошибках через Java Bug Database.


Четвертый бета-релиз Hibernate ORM 7.0.0 содержит:

  • переход на спецификацию Jakarta Persistence 3.2; 

  • последнюю версию, предназначенную для Jakarta EE 11; 

  • базовую поддержку JDK 17; 

  • улучшенные проверки доменной модели; 

  • миграцию от Hibernate Commons Annotations (HCANN) к новому проекту Hibernate Models для низкоуровневой обработки доменной модели.

Выпуск Hibernate Reactive 2.4.5.Final обеспечивает совместимость с Hibernate ORM 6.6.7.Final.


Micronaut Foundation выпустила версию 4.7.5 Micronaut Framework, включающую исправления ошибок и обновления для модулей Micronaut Security, Micronaut Validation, Micronaut Maven Plugin, Micronaut Kafka, Micronaut Test Resources и Micronaut Discovery Client. Более подробную информацию об этом выпуске можно найти в примечаниях к выпуску.


Релиз Quarkus 3.18.2 (Quarkus 3.18.0 был пропущен) несет обновления зависимостей и исправления:

  • исправление NullPointerException в Hibernate ORM при сбое подключения к БД;

  • при копировании нативного исполняемого файла из хоста в контейнер теперь сохраняются Unix-права на выполнение.

Более подробную информацию об этом выпуске можно найти в журнале изменений.


Выпуск Kora 1.1.20 с небольшими улучшениями и исправлениями:

  • Добавлена аннотация оптимизации @EntityCassandra.

  • Добавлен более гибкий способ настройки компонентов gRPC.

  • Исправлены ошибки обработки Cassandra UDT типа для списков.

  • Исправлена работа дискриминаторов моделей в OpenAPI-генераторе.

Более подробную информацию об этом выпуске можно найти в журнале изменений.


Вышел GlassFish 7.0.22

Двадцать второй релиз включает:

  • исправления ошибок;

  • обновления зависимостей;

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

  • добавление атрибутов Add-Opens и Add-Exports в статический shell GlassFish для совместимости с новыми версиями Java, GlassFish Embedded и JVM.

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

Native Build Tools 0.10.5 

Oracle Labs выпустила версию Native Build Tools — проекта GraalVM, состоящего из плагинов для взаимодействия с GraalVM Native Image. Среди изменений:

  • поддержка единого reachability-metadata.json, так как ранее тесты ожидали раздельные файлы метаданных;

  • исправление ошибки Gradle-плагина Native Build Tools, возникающей из-за временного файла access-filter.json.

Анонсирована версия 4.7.3.1 Graal Development Kit, включающая интеграцию с Micronaut 4.7.3.

Выпуск Spring Cloud Stream Applications 2025.0.0 и 2024.0.1 

Новые выпуски поставляются с обновлениями зависимостей до Spring Boot 3.4.2/Spring Cloud 2024.0.0 и Spring Boot 3.3.8/Spring Cloud 2023.0.5. Среди нововведений:

  • поддержка Micrometer Tracing;

  • новый параметр enableSecurityScan в common.yml для управления Trivy-сканированием безопасности (по умолчанию — false).

Вышел первый бета-релиз LangChain4j 1.0.0

Релиз несет:

  • методы generate() стали deprecated, заменены на методы chat() для нового Chat API;

  • рефакторинг ToolExecution для конфигурирования и исполнения инструментов.

Команда планирует GA-релиз в первом квартале 2025 года.

JHipster 8.9.0 и Jhipster Lite 1.28.0/1.27.0

Версии 1.28.0 и 1.27.0 JHipster Lite поставляются со многими обновлениями зависимостей, в частности Vitest 3.0.5 для исправления критической проблемы безопасности, CVE-2025-24964.

Выпуск JHipster 8.9.0 включает: обновления зависимостей до Spring Boot 3.4.2, Node 22.13.1, Gradle 8.12.1, Angular 19.0.6 и Typescript 5.7.3 и поддержку простых полей времени (класс Java LocalTime) без привязки к дате в JHipster Domain Language (JDL).

Выпуск Keycloak 26.1.1 

В новом выпуске содержатся исправления ошибок и новые функции, такие как:

  • новая опция x509-cert-auth-crl-abort-if-non-updated, предотвращающая вход, если CRL не обновлена;

  • опция force-login в reset-credential-email, завершающая сессию и принуждающая осуществить новый вход.

Состоялся релиз Jox 0.4.0

Jox — библиотека виртуальных потоков, которая реализует эффективную структуру данных Channel в Java, предназначенную для использования с виртуальными потоками, — включает примечательные изменения:

  • рефакторинг Channel (конструктор теперь private);

  • изменение расположения значения размера буфера канала.

Вышла 25.0.0.2-beta Open Liberty,

IBM выпустила версию 25.0.0.2-beta Open Liberty, в которой реализована возможность настройки функции MicroProfile Telemetry 2.0, mpTelemetry-2.0 для отправки журналов аудита Liberty в коллектор OpenTelemetry.

Project Reactor 2024.0.3

Третий сервисный релиз, предоставляет обновления зависимостей до reactor-core 3.7.3, reactor-netty 1.2.3, reactor-pool 1.1.2.

Аналогично Project Reactor 2023.0.15, пятнадцатый сервисный релиз, предоставляет обновления зависимостей.

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

Java 24 - Better Language, Better APIs, Better Runtime Лекция Никола Поллока, разработчика Java в Oracle. Посвящена нововведениям в Java 24 и другим ключевым изменениям в экосистеме Java. В выступлении обсуждается ускорение запуска приложений с помощью AOT-компиляции, улучшения в работе виртуальных потоков, новые API для работы с байт-кодом и сборщиками потоков, а еще оптимизация сборщиков мусора, включая GGC и ZGC. Лекция полезна разработчикам, которые хотят быть в курсе последних изменений в Java, улучшить производительность своих приложений и освоить новые инструменты и подходы в разработке.

Project Loom and Virtual Threads: Next Phases Лекция посвящена Project Loom и внедрению виртуальных потоков в JDK 21, которые позволяют повысить уровень конкурентности в серверных приложениях. В ходе выступления обсуждаются ключевые аспекты работы виртуальных потоков, их преимущества и проблемы, связанные с их использованием. Будет полезно разработчикам, интересующимся многопоточностью, структурной конкурентностью и новыми возможностями Java, включая улучшения в JDK 21 и будущих версиях.

Modern Java Deep Dive Большое видео на 2,5 часа, в котором подробно рассказывается обо всех современных фичах в Java, которые принесли Java 22 и 23: unnamed patterns, stream gatherers, class-file api и многое другое. Если не следили за изменениями, это отличное видео, чтобы все наверстать. 

How I became my son's hero by building an AI Minecraft Mod with LangChain4J by Dominique Broeglin Gen AI, RAG — если вам не знакомы эти слова, это видео для вас. Помимо указанного в видео базово разбирается LangChain4J. А еще автор рассказал про проблемы тестирования приложений с Gen AI. Для любителей Майнкрафта оставим картинку со звуком.

Java annotation processing magic for muggles by Álvaro Sánchez Mariscal Arnaiz Доклад посвящен annotation processing. В видео автор разобрал runtime, buildtime и compiletime annotation processing. Подробно были разобраны инструменты, которые используют annotation processing, а также инструменты, которые позволяют его произвести. Не забыли обсудить медленный Spring, то, как Lombok может сломать Micronaut, и почему Lombok «неправильно» врывается в Java-компиляцию.

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

3 200% нагрузки на процессор. Автор столкнулся с проблемой, когда его серверная машина оказалась перегружена из-за использования незащищенной TreeMap в многопоточной среде. Это привело к бесконечному циклу и нагрузке на процессор в 3 200%. 

Автор подробно описывает, как он диагностировал проблему, воспроизвел ее в разных языках программирования (Java, C++, Go и других) и предлагает способы ее решения. Основной акцент сделан на важности многопоточного тестирования, правильной обработки исключений и использования синхронизированных структур данных. Статья полезна разработчикам, работающим с многопоточностью, и тем, кто хочет глубже понять, как избежать подобных ошибок в своих проектах.

Вышла третья и четвертая часть из серии Introduction to HotSpot JVM C2 JIT Compiler. В третьей части серии исследуется флаг CITime, который позволяет измерять время компиляции на разных этапах. Разобраны ключевые фазы оптимизации в C2-компиляторе, включая On Stack Replacement (OSR), и проанализировано влияние этих процессов на производительность JIT-компиляции.

В четвертой части рассматриваются оптимизации циклов в C2 JIT-компиляторе HotSpot JVM. Описаны такие техники, как канонизация CountedLoop, разворачивание и векторизация циклов, устранение проверок границ и предсказание условий. Приведен пример трассировки оптимизаций с -XX:+TraceLoopOpts.

Дикая Java. Небольшая развлекательная статья про разные способы заставить Java неочевидно работать. Запуску комментариев мы поразились всей редакцией. Статья будет интересна всем, кто программирует на Java, и расскажет, почему та или иная дичь на Java возможна 😀

Эволюция экосистемы Java под интеграцию ИИ. Статья не только дает обзор инструментов для интеграции ИИ, но и содержит подробный туториал, который позволит попрактиковаться в их применении. Следуя ему, можно написать своего чат-бота для помощи в траблшутинге утечек памяти в Java. Бот будет взаимодействовать с сервисом Oracle Generative AI через соответствующую SDK. Для формирования промптов, работы с контекстом и историей чата используются LangChain4j и БД chromadb.

Секреты JVM: что происходит с ошибками под капотом. Короткая и простая статья о том, как в JVM происходит обработка исключений. Из нее вы узнаете, что такое таблицы исключений и по какому алгоритму происходит поиск нужного блока catch и всех блоков finally, которые нужно выполнить. 

Gradle best practices. Отличная шпаргалка по best practices при использовании Gradle. Практики разделены на две секции — организация и оптимизация. Очень приятно, что каждый пункт сопровождается ссылкой на соответствующий раздел в документации Gradle. И да, статья на сайте Kotlin, поэтому неудивительно, что первый совет — используйте Kotlin DSL 🙂 

Valhalla — эпичный рефакторинг Java (статьи на Хабре в трех частях: 1, 2, 3).

Текстовая расшифровка и перевод выступления Брайана Гетца Valhalla - Java's Epic Refactor, о котором мы рассказывали в одном из предыдущих выпусков. 

Феня

Мур, всем привет! Я Феня, аватар проекта Valhalla в этом дайджесте. Спасибо АйО, что перевели доклад обо мне. Брайан подробно рассказал, почему мой приход в Java кардинально поменяет правила игры в отношении классов и примитивов. А также как это позволит в разы эффективнее работать с памятью. Помните: хоть я надвигаюсь уже очень долго, мой приход неизбежен. Так что лучше бы вам быть к нему готовым! 

Database Migrations in the Real World | The IntelliJ IDEA Blog. Статья Database Migrations in the Real World обсуждает ключевые проблемы миграции баз данных в масштабных системах. Автор объясняет, почему выполнение миграций при запуске приложения может привести к сбоям, и рекомендует раздельное применение изменений. Помимо этого рассматриваются ограничения транзакционных DDL-операций в разных СУБД и способы предотвращения конфликтов при одновременных обновлениях схемы. На Хабре вышел перевод этой статьи от команды Spring АйО.

Introduction to MockMvcTester. Статья знакомит с MockMvcTester — новым API в Spring 6.2, который упрощает тестирование контроллеров Spring MVC, интегрируя MockMvc с AssertJ. Автор объясняет его преимущества, настройку и демонстрирует примеры тестирования HTTP-запросов.

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

Context-switching is the main productivity killer for developers. Статья объясняет, как частые переключения между задачами снижают продуктивность разработчиков. Автор отмечает, что каждое быстрое сообщение в Slack приводит к переключению контекста и в результате к потере времени и ошибкам. Он анализирует причины постоянных переключений и предлагает стратегии для их минимизации.

Заговор разработчиков против корпораций: архитектура и принципы. В прошлом выпуске мы уже приводили предыдущую статью — разоблачение техноанархистов, посвященную практикам саботажа в кодовой базе. Автор, как и обещал, выпустил следующую часть. Из нее вы узнаете шокирующую правду о принципах SOLID. Увидите, как усиливают гравитацию в монорепозиториях, чтобы замедлить разработку, и как unit-тесты под громкие возгласы об облегчении рефакторинга на самом деле душат в разработчиках желание им заниматься. Обязательно прочтите и помните: техноанархисты повсюду. А с распространением ИИ-ассистентов их, вероятно, станет только больше...

The End of Programming as We Know It. Интересная статья, где автор очень оптимистично смотрит на будущее программирование в эпоху ИИ. Разработчики будут активно пользоваться ИИ-ассистентами, которые уже сейчас обладают внушительными возможностями. Появилось даже понятие CHOP (Chat-oriented programming). Но это вовсе не значит, что ИИ в какой-то момент заменит разработчиков и кто угодно сможет написать сложную систему, просто написывая ИИ-ассистенту. Ведь программирование никогда не было просто написанием кода. 

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

OpenLDK. JIT-компилятор и среда выполнения Java, который переводит байт-код в Lisp, что обеспечивает взаимодействие между кодом на Java и Common Lisp. Как говорится, месье знает толк в извращениях!

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

15 января прошла конференция Voxxed Deys CERN, а 14 февраля опубликовали видео докладов. 

6 марта 2025 года прошла конференция Spring Now 2025, организованная командой Spring АйО.

Спасибо, что читаете нас! Увидимся через месяц 😉

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

Теги:
Хабы:
Всего голосов 15: ↑15 и ↓0+15
Комментарии0

Публикации

Информация

Сайт
l.tbank.ru
Дата регистрации
Дата основания
Численность
свыше 10 000 человек
Местоположение
Россия