Випуск платформи Java SE 22 та відкритої еталонної реалізації OpenJDK 22

Після шести місяців розробки компанія Oracle випустила платформу Java SE 22 (Java Platform, Standard Edition 22), як еталонну реалізацію якої використовується відкритий проект OpenJDK. За винятком видалення деяких застарілих можливостей Java SE 22 збережена зворотна сумісність з минулими випусками платформи Java - більшість раніше написаних Java-проектів без змін будуть працездатні при запуску під керуванням нової версії. Готові для встановлення складання Java SE 22 (JDK, JRE та Server JRE) підготовлені для Linux (x86_64, AArch64), Windows (x86_64) та macOS (x86_64, AArch64). Розроблена в рамках проекту OpenJDK еталонна реалізація Java 22 повністю відкрита під ліцензією GPLv2 з винятками GNU ClassPath, що дозволяє динамічне зв'язування з комерційними продуктами.

Java SE 22 віднесено до категорії випусків із звичайним терміном підтримки, оновлення для якого будуть випускатися до наступного випуску. В якості гілки з тривалим терміном підтримки (LTS) слід використовувати Java SE 21 або Java SE 17, оновлення для яких будуть випускатися до 2031 і 2029 відповідно (загальнодоступні - до 2028 і 2026 років). Загальнодоступну підтримку LTS-гілки Java SE 11 припинено у вересні минулого року, але розширена підтримка буде здійснюватися до 2032 року. Розширена підтримка LTS-гілки Java SE 8 триватиме до 2030 року.

Нагадаємо, що починаючи з випуску Java 10 проект перейшов на новий процес розробки, який передбачає більш короткий цикл формування нових релізів. Нова функціональність тепер розвивається в одній master-гілці, що постійно оновлюється, в яку включаються вже готові зміни і від якої раз на шість місяців відгалужуються гілки для стабілізації нових випусків.

З нововведень Java 22 можна відзначити:

  • У збирачі сміття G1 реалізована підтримка закріплення областей (region pinning), що дозволяє тимчасово зафіксувати розташування Java-об'єктів у пам'яті, щоб уникнути їх переміщення збирачем сміття та забезпечити безпечну передачу посилань на ці об'єкти між Java та нативним кодом. Закріплення дозволяє знизити затримки та обійтися без відключення складання сміття під час виконання критичних секцій (critical regions) JNI (Java Native Interface) з нативним кодом (під час виконання даних секцій JVM не повинен переміщати пов'язані з ними критичні об'єкти для того, щоб уникнути станів гонки). Закріплення виводить критичні об'єкти з поля зору збирача сміття, яке може продовжувати чистити незакріплені області.
  • Додано попередню можливість, що дозволяє вказівку в конструкторах виразів перед викликом super(…), що використовується для явного виклику конструктора батьківського класу з конструктора спадкового класу, якщо ці вирази не посилаються на екземпляр, що створюється конструктором. class Outer { void hello() { System.out.println(«Hello»); } class Inner { Inner() { hello(); super(); } } }
  • Стабілізовано API FFM (Foreign Function & Memory), що дозволяє організувати взаємодію Java-програм із зовнішніми кодом та даними через виклик функцій із зовнішніх бібліотек та доступ до пам'яті поза JVM, не вдаючись до використання JNI (Java Native Interface).
  • Увімкнена підтримка безіменних змінних та зіставлень із шаблоном — замість невикористовуваних, але необхідних під час виклику змінних та шаблонів тепер можна вказувати символ «_». // було String pageName = switch (page) { case GitHubIssuePage(var url, content, var links, int issueNumber) -> "ISSUE #" + issueNumber; … }; // тепер можна String pageName = switch (page) { case GitHubIssuePage(_, _, _, int issueNumber) -> «ISSUE#» + issueNumber; };
  • Запропоновано попередню реалізацію API Class-File для розбору, генерації та перетворення файлів із класами Java. ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse(bytes); byte[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce instanceof MethodModel mm && mm.methodName().stringValue()). startsWith("debug"))) { classBuilder.with(ce); } } });
  • В утиліті java реалізована можливість запуску Java-програм, що постачаються у формі декількох файлів із кодом або передкомпільованих бібліотек класів, без роздільної компіляції цих файлів та без конфігурування складальної системи. Нова можливість спрощує запуск програм, у яких код різних класів виділено окремі файли. Prog.java: class Prog { public static void main(String[] args) { Helper.run(); } } Helper.java: class Helper { static void run() { System.out.println(«Hello!»); } }

    Наприклад, для запуску програми, що складається з двох файлів «Prog.java» та «Helper.java», тепер достатньо запустити «java Prog.java», що призведе до компіляції класу Prog, визначення посилання на клас Helper, пошуку та компіляції файлу Helper. java та виклику методу main.

  • Додана друга попередня реалізація рядкових шаблонів (String Template), реалізованих на додаток до рядкових літералів та блоків тексту. Рядкові шаблони дозволяють поєднувати текст з виразами, що обчислюються, і змінними без використання оператора «+». Підстановка виразів здійснюється за допомогою підстановок \{..}, при цьому для перевірки коректності значень, що підставляються, можуть підключатися спеціальні обробники. Наприклад, обробник SQL забезпечує перевірку значень, що поставляються в SQL-код, і повертає на виході об'єкт java.sql.Statement, а обробник JSON відстежує коректність підстановок JSON і повертає JsonNode. String query = "SELECT * FROM Person p WHERE p." + property + » = '» + value + «'»; // було Statement query = SQL.»»»SELECT * FROM Person p WHERE p. // стало
  • Додано сьому попередню реалізацію API Vector, що надає функції для векторних обчислень, які виконуються з використанням векторних інструкцій процесорів x86_64 та AArch64 і дозволяють одночасно застосувати операції відразу до кількох значень (SIMD). На відміну від можливостей з автовекторизації скалярних операцій, що надаються в JIT-компіляторі HotSpot, новий API дає можливість явно керувати векторизацією для паралельної обробки даних.
  • Додано попередню реалізацію розширеного API Stream, що підтримує визначення власних проміжних операцій, які можуть бути корисними у випадках, коли існуючих вбудованих проміжних операцій недостатньо для бажаного перетворення даних. Власні обробники підключаються за допомогою нової проміжної операції Stream::gather(Gatherer), яка обробляє елементи потоку, застосовуючи заданий користувачем обробник. jshell> Stream.of(1,2,3,4,5,6,7,8,9).gather(new WindowFixed(3)).toList() $1 ==> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
  • Запропоновано для тестування другий варіант експериментального API для структурованого паралелізму (Structured Concurrency), що спрощує розробку багатопотокових додатків за рахунок обробки декількох завдань, що виконуються в різних потоках, як єдиного блоку.
  • Додано другу попередню реалізацію неявно оголошених класів та безіменних екземплярів методу «main», в яких можна обійтися без оголошень public/static, передачі масиву аргументів та інших сутностей, пов'язаних з оголошенням класу. // було public class HelloWorld { public static void main(String[] args) { System.out.println(«Hello world!»); } } // тепер можна void main() { System.out.println(«Hello, World!»); }
  • Додано другу попередню реалізацію обмежених значень (Scoped Values), що дозволяють спільно використовувати незмінні дані в потоках і ефективно обмінюватися даними між дочірніми потоками (значення успадковуються). Scoped Values ​​розвиваються для заміни механізму змінних локальних до потоку (thread-local variables) і більш ефективні при використанні дуже великої кількості віртуальних потоків (тисячі та мільйони потоків). Головна відмінність Scoped Values ​​від змінних локальних до потоку в тому, що перші записуються один раз, надалі не можуть бути змінені і залишаються доступними лише на час виконання потоку.
  • У збирачі сміття Parallel підвищено продуктивність роботи з великими масивами об'єктів. Оптимізація дозволила в деяких тестах з великими масивами об'єктів на 20% зменшити затримку перед початком пошуку об'єкта.

Додатково можна відзначити публікацію оновлення платформи для створення програм із графічним інтерфейсом JavaFX 22.

Джерело: opennet.ru

Додати коментар або відгук