Java 19 — новые фичи и изменения
Июнь 23, 2022
9-го июня JDK 19 приобрел окончательную форму, перейдя в первую фазу Rampdown. И хотя экспериментировать с новыми возможностями языка само по себе интересно, не это главное в предстоящем релизе.
JDK 19 — это релиз на полпути от прошлой LTS-версии к следующей, и таким образом он отражает текущие тенденции развития языка Java, а именно, стремление к максимальной универсальности. Так, порт на RISC-V расширяет диапазон совместимых платформ, Foreign Function & Memory API позволяет использовать данные вне JVM, а виртуальные потоки делают Java идеальным выбором для многопоточных приложений. И это только три улучшения из семи. Давайте проанализируем все JEP и убедимся, что возможности Java расширяются с каждой версией!
- Разбираем улучшения (JEP) в Java 19
- JEP 405: Record Patterns (Preview)
- JEP 422: Портирование JDK на Linux/RISC-V
- JEP 424: Foreign Function & Memory API (Preview)
- JEP 425: Виртуальные потоки (Preview)
- JEP 426: Vector API (четвертый Incubator)
- JEP 427: Pattern matching для switch (третий Preview)
- JEP 428: Структурная многопоточность (Incubator)
- Заключение
Разбираем улучшения (JEP) в Java 19
JEP 405: Record Patterns (Preview)
JEP 405 — фича в режиме Preview, призванная улучшить механизм сопоставления с образцом с помощью record patterns, используемых для деконструкции структурных значений. Pattern matching позволяет реализовать принципы декларативного программирования на Java. Данный JEP продолжает ряд улучшений, внедренных в JDK 16 (pattern matching для instanceof
), 17 и 18 (pattern matching для switch
).
Record patterns являются вложенными, что позволяет обозначать элементы образцов (records), которые входят в другие образцы. Это упрощает управление объектами и позволяет разработчикам писать более лаконичный и понятный код.
JEP 422: Портирование JDK на Linux/RISC-V
RISC-V — это открытая архитектура набора команд, обладающая всеми преимуществами архитектуры RISC и опенсорсного ПО. Любая компания или инженер может использовать RISC-V в разработках или исследованиях без необходимости платить лицензионные отчисления. Благодаря этому все больше отраслей используют данную технологию. Микропроцессоры также широко используются во встроенных системах. Если хотите узнать больше об архитектуре RISC-V, ознакомьтесь с нашей статьей на эту тему.
JEP 422 портирует JDK на Linux/RISC-V. Порт будет поддерживать конфигурацию RV64GV, 64-битную архитектуру RISC-V общего назначения с инструкциями для выполнения векторных операций. Порт включает четыре подсистемы HotSpot:
- Шаблонный интерпретатор;
- JIT-компилятор C1 (клиент);
- JIT-компилятор C2 (сервер);
- все текущие стандартные сборщики мусора, включая ZGC и Shenandoah
Компания Huawei Technologies, разработавшая порт, будет поддерживать его и в дальнейшем посредством обновлений и тестов.
Портирование JDK на RISC-V — важный шаг по интеграции Java и RISC-V. Axiom JDK полагает, что сочетание обеих технологий создает плодородную почву для интересных инновационных решений. Именно поэтому мы планируем создать версию Axiom JDK, адаптированную под встроенные системы и оптимизированную под RISC-V.
JEP 424: Foreign Function & Memory API (Preview)
Эта фича была впервые внедрена в JDK 17 в режиме первого Incubator, а в JDK 18 была обновлена до второго Incubator. В JDK 19 у нее статус preview API.
Foreign Function & Memory (FFM) API заменит нативный интерфейс Java (JNI) и позволит разработчикам более эффективно использовать код и память вне JVM. Кроме того, данная функция обеспечит повышенную безопасность работы с внешними данными, так как большая часть FFM API не подвергает риску приложение на Java. Хотя она по умолчанию запрещает вызывать небезопасные методы, это все еще можно сделать, но при этом во время исполнения программы будет выведено предупреждение.
JEP 424 включает в себя улучшения, сделанные на основании отзывов разработчиков в период двух предыдущих релизов Java.
JEP 425: Виртуальные потоки (Preview)
Это одна из самых интересных фич будущего релиза, так как внедрение виртуальных потоков, разрабатываемых в рамках проекта Loom, поможет значительно повысить производительность и надежность многопоточных высоконагруженных Java-приложений.
Сейчас каждый поток в Java использует один поток операционной системы. Их поведение поддается мониторингу и отладке, но в реальных системах их максимальное количество невелико. С другой стороны, асинхронное программирование позволяет масштабировать приложение за счет того, что код не предполагает последовательного исполнения в одном потоке, но мониторинг в таких случаях выполнять сложнее.
Виртуальные потоки будут использовать имеющийся API java.lang.Thread
, но без привязки к потоку ОС на весь срок жизни, только на период выполнения вычислений. Таким образом, множество виртуальных потоков смогут использовать один поток ОС, поэтому количество задач, выполняемых одновременно, можно увеличить до десятков тысяч. В то же время виртуальные потоки так же легко поддаются профилированию и мониторингу, как и обычные потоки.
JEP 426: Vector API (четвертый Incubator)
Vector API помогает повысить производительность приложений, выполняющих определенные математические операции. API обеспечивает надежную компиляцию векторных расчетов инструкции во время исполнения приложения. Данная фича была добавлена в JDK 16 в качестве incubation API. JEP 426 — это четвертый Incubator, включающий следующие улучшения:
- Появилась возможность хранить векторы в
MemorySegments
и загружать их оттуда в соответствии с JEP 424, описанным выше - Добавлены новые cross-lane векторные операции: compress и expand, а также операция векторной маски compress
- Добавлены дополнительные побитовые integral lane операции, считающие количество одиночных битов, битов ведущих и конечных нулей, меняющие порядок битов и байтов на обратный, сжимающие и разворачивающие биты
JEP 427: Pattern matching для switch (третий Preview)
Фича Pattern matching появилась в Java 17 в качестве Preview и была обновлена до второго Preview в Java 18. Это третий Preview, включающий
- Замену защищенных (guarded) образцов на оператор when в блоке
switch
- Приведение семантики образца
switch
в соответствие с прежней семантикой switch в случаях, когда значение селектора равноnull
Цель данной фичи — добавление проверки соответствия образцов к выражениям и операторам switch
, благодаря чему
- Образцы могут использоваться в метках блока
- Образец
switch
учитывает все возможные входящие значения, что повышает безопасность операций
При этом компиляция существующих операторов switch
будет выполняться без изменений.
JEP 428: Структурная многопоточность (Incubator)
Библиотека для структурной многопоточности позволит улучшить многопоточное программирование на Java. Многопоточность связана с определенными рисками, такими как задержки в работе приложения при отмене задачи или утечки памяти. Эти проблемы возникают из-за того, что одновременно выполняемые задачи независимы друг от друга, поэтому если один поток выбросит исключение, другие потоки этого не заметят.
Структурная многопоточность обеспечивает координацию потоков таким образом, что потоки, работающие в рамках одной задачи, заключены в один синтаксический блок и могут реагировать на ошибки в работе своих «товарищей».
JEP 428 будет хорошим дополнением к виртуальным потокам, описанным выше. В условиях тысяч параллельных виртуальных потоков от надлежащей координации и структуризации многопоточности зависит функционирование всего приложения.
Заключение
В целом, улучшения, представленные в JDK 19, расширяют потенциал Java во многих областях. Работа на встроенных устройствах, научные вычисления, многопоточные приложения — вне зависимости от задачи, Java обеспечивает разработчиков удобной средой разработки и исполнения, которую можно использовать в любой среде и для любых решений!
Axiom JDK 19 выйдет по расписанию в сентябре, поэтому вскоре вы сможете скачать его и протестировать новый функционал. Но если вы только собираетесь мигрировать с Oracle на OpenJDK, познакомьтесь с нашим прогрессивным Java-рантаймом с российской техподдержкой прямо сейчас!