Всем привет! 👋 👋 👋 Мы — Java-разработчики Тинькофф: Андрей, Арсений и Константин. Собираем все интересное из мира Java-разработки и решили делиться этим не только с коллегами, но и со всем сообществом. В этом выпуске мы погрузимся в глубины нескольких JEP, что скрываются во мраке. Взглянем на проекты Loom и Вальхаллу.  В нашем мрачном путешествии поговорим о сборке мусора и таинственном процессе утилизации ненужных объектов в Java. Какие ужасы скрываются в этих загробных мирах? Заглянем в бездну тестирования и воззовем к силам распределенных транзакций, о которых шепчут только отважные. Но не только мрачные стороны Java раскроют нам свои секреты. Воссияет новый JShell, воскрешенный эхом древних заклинаний. Приготовьтесь отправиться в удивительное путешествие мира Java. В честь Хеллоуина, эту аннотацию нам помог сгенерировать ChatGPT JEP draft: Support Markdown in Documentation Comments — появился интересный JEP draft, в котором предлагается ввести новый вид комментариев, поддерживающих Markdown. FFM goes final! Foreign Function & Memory API вышел из превью и интегрирован в JDK 22 в финальном статусе. Напомним, что он призван заменить JNI и упростить интеграцию с нативным кодом в Java, а еще сделать ее более производительной.  Joker 2023 — с 9 по 14 октября прошла ежегодная конференция Joker 2023. Можно ознакомиться с темами докладов и посмотреть доступные презентации. Что выбрать: ArrayList или LinkedList? Это не только популярный вопрос на интервью, но и важное решение, которое мы часто принимаем в повседневной работе. В интернете много материалов на эту тему. Это видео интересно тем, что разбор происходит на основе отчетов, полученных с помощью JMH. Можно увидеть, как структура выбранной коллекции влияет на работу с различными объемами данных в разных кейсах.  Николай рассказывает о том, как JEP 457 Classfile API упростит миграцию на новые мажорные версии Java. За счет нового уровня абстракции в виде API для работы с байт-кодом нам больше не нужно будет вслед за Java апдейтить все зависимости в проекте. Правда, все это великолепие станет стабильным в лучшем случае только в 25 Java через два-три года 🙂 Сборщик мусора G1, используемый по умолчанию в Java, — увлекательное технологическое решение с богатой историей. В этом выпуске мы глубоко погружаемся в сборщик мусора, чтобы понять его ключевые архитектурные особенности, позволяющие достигать поставленных целей производительности. Рассмотрим, как использовать G1, и заглянем в его будущее. Разработанная командой JVM в компании Oracle, Oracle Java Management Cloud Service представила искусственный интеллект для анализа и генерации рекомендаций по настройке, чтобы улучшить производительность java-приложений. В ролике показано, как он работает и как им пользоваться. Инструмент JShell, интерактивная среда чтения, выполнения и вывода результатов — REPL. Его добавили в JDK 9, обновили в JDK 21 для более удобного доступа к инструментам JDK. Давайте посмотрим на это! Доклад о Project Leyden от архитектора языка Java, известного по книге Java Concurrency in Practice. Напомним, что Project Leyden призван уменьшить время старта и достижения максимальной производительности для java-приложений. Brian Goetz рассказывает о фичах, которые только планируется реализовать в рамках проекта, и о тех, которые можно использовать уже сейчас. А еще о том, почему Java может превосходить в производительности C. Доклад затрагивает много топиков, связанных с JVM, и может быть полезен тем, кто хочет углубиться в эту тему. Появились записи обсуждения выпусков нашего дайджеста за август и сентябрь в рамках Книжного клуба.rar на канале JVM Dev. В выпуске за август обсудили апгрейд с Java 17 до 21, партиционирование таблиц в Postgresql и пирамиду потребностей Маслоу для разработчиков Java/Kotlin, а в выпуске за сентябрь обсудили саму Java 21, а также Project Loom. What is… concurrent undo cycle — о concurrent undo cycle в сборщике G1GC и может быть полезна для более глубокого погружения в работу сборщиков мусора. Сам же concurrent undo cycle появился еще в Java 16 для оптимизации самых требовательных к процессору этапов сборки мусора.  How to Diagnose and Mitigate Pinning in Java’s Virtual Thread Execution — полезная статья о проблеме застревания виртуальных потоков. Автор объясняет, что такое застревание, почему это плохо, как его диагностировать и избежать. А еще о том, почему в мире виртуальных потоков не стоит пользоваться synchronized.  Асинхронный API First — о принципе разработки API First, который подразумевает, что API является основной частью приложения и приоритетным аспектом разработки как для клиентской, так и для серверной сторон. Описываются проблемы, с которыми сталкиваются при документировании интерфейсов, работающих с брокерами сообщений. Распределенные транзакции. Отличный конспект про распределенные транзакции, их проблемы и решения с примерами. Подойдет для подготовки к собесу на middle-/senior-разработчика или для ликбеза по теме. Описаны двухфазный коммит, орекстрация SAGA, возможные реализации хореографии SAGA и parallel pipelines, есть их сравнительная характеристика. Beyond Loom: Weaving new concurrency patterns. Автор рассматривает паттерны, которые появляются в языке с приходом project loom и разбирает то, как эти паттерны будут взаимодействовать с будущими фичами Project Loom — Structured Concurrency и Scoped Values. Будет полезно всем, кто собирается пользоваться преимуществами виртуальных потоков. Beyond Pass/Fail- a Modern Approach to Java Integration Testing. Уже не первый раз мы слышим, что пирамида тестирования устарела. В этом есть смысл. Благодаря таким инструментам, как Testcontainers, и их поддержке в Spring писать и поддерживать интеграционные тесты стало гораздо проще. Преимущества очевидны: они не так сильно привязаны к кодовой базе и тестируют совместную работу компонентов приложения. В статье упоминается, что благодаря им мы можем получить больше информации, чем прошел тест или упал. Добавив трейсы и инструмент для их анализа, можно отловить, например, проблемы с производительностью. The best way to use Spring Data JPA Stream methods. Короткая, но полезная заметка о том, как использовать Stream API в Spring Data JPA репозиториях. Если все правильно настроить, получится простой код, который будет выгружать данные небольшими частями и не нагрузит ни базу долгими запросами, ни память приложения большим количеством объектов. Как упростить себе жизнь: удобные юнит-тесты с JUnit и AssertJ. Хороший туториал о юнит-тестировании, который поможет вкатиться в тему. Простые и понятные примеры иллюстрируют проверенные практики. Жаль, что хотя бы поверхностно не затронута тема мокирования, ибо без него юниты представить сложно. Level-up your Java Debugging Skills with on-demand Debugging. Интересный туториал о том, как настроить удаленный дебаг так, чтобы сессия стартовала при прокидывании исключения или команды от jcmd.  Посторонись, Copilot: подборка разнообразных AI‑инструментов для разработчиков. Мир разработки ПО стремительно меняется. Казалось бы, ChatGPT появился только вчера, а сейчас уже есть огромное количество всевозможных искусственных помощников. В статье — обзор инструментов, которые помогут в работе с разными задачами. Также вышел выпуск java-дайджеста от Олега Чирухина. Рекомендуем к прочтению. Спасибо что были с нами! Ждем обратную связь в комментариях. Увидимся через месяц 😉  Java Developer