Издание на Java SE 23 и OpenJDK 23

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

Java SE 23 е класифицирана като версия с обикновен срок на поддръжка, за която обновления ще бъдат пуснати до следващото издание. За дългосрочна поддръжка (LTS) трябва да се използва Java SE 21 или Java SE 17, за които обновления ще бъдат пуснати до 2031 и 2029 година съответно (публични — до 2028 и 2026 година). Разширената поддръжка на LTS версията Java SE 8 ще продължи до 2030 година, а Java SE 11 — до 2032 година.

Сред новостите, предложени в Java SE 23, са:

  • По подразбиране е включен генеративният режим на работа на сборщика на боклук ZGC (Generational Z Garbage Collector), който използва разделно обработване на "стари" и "млади" обекти, което увеличава ефективността на почистването на наскоро създадените обекти с кратък живот. Използването на Generational ZGC намалява рисковете от паузи по време на разпределението на ресурси, намалява натоварването на CPU и потреблението на памет при събиране на боклука. Тестването на Generational ZGC с Apache Cassandra 4 показа четирикратно увеличение на пропускната способност при фиксиран размер на купчината (heap) и намаление на размера на купчината с четвърт при неизменна пропускна способност.
  • В JavaDoc е добавена поддръжка за използване на Markdown за документиране на кода в коментарите, което може да се използва вместо смес от HTML и @-тагове на JavaDoc.
    Издание на Java SE 23 и OpenJDK 23
  • Механизмите за съвпадение с образци са разширени с предварителна поддръжка за използването на примитивни типове (int, byte, char и други основни типове, които не са обекти) във всички видове шаблони, в оператора «instanceof» и в блоковете «switch». switch (x.getStatus()) { case 0 -> «okay»; case 1 -> «warning»; case 2 -> «error»; case int i -> «unknown status: » + i; } if (i instanceof byte b) { … b … }
  • Добавена е предварителна поддръжка за използване на едно изразяване «import module M» за импорт на всички пакети, експортирани от посочения модул. Промяната значително опростява повторното използване на модулни библиотеки, позволявайки включването на библиотеки и класове без указване на местоположението им в йерархията на пакетите. Например, указанието «import module java.base» ще доведе до импортиране на всички 54 пакета, влизащи в модула java.base, които преди това бихме трябвало да споменем поотделно («import java.io.*», «import java.util.*» и т.н.).

    Предложена е втора предварителна реализация на 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); } } });

  • Предложена е осма предварителна реализация на API Vector, предоставящо функции за векторни изчисления, които се извършват с помощта на векторни инструкции на процесорите x86_64 и AArch64 и позволяват едновременно прилагане на операции на няколко стойности (SIMD). В отличие от възможностите за автоматична векторизация на скаларни операции, предоставяни от JIT компилатора HotSpot, новото API дава възможност за явно управление на векторизацията за паралелна обработка на данни.
  • В клас java.io.Console са добавени методи format, printf, readPassword и readLine за форматиране, извеждане и четене на текст с оглед на избраната локализация. System.console().printf(Locale.FRANCE, «%1$tY-%1$tB-%1$te %1$tA», new Date()) 2024-mai-16 jeudi
  • Добавена втора предварителна реализация на разширения 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]]
  • Добавена трета предварителна реализация на неявно обявените класове и безименните инстанции на метода „main“, в които може да се заобиколи необходимостта от обявяване на public/static, предаване на масив от аргументи и други елементи, свързани с обявяването на клас. // преди public class HelloWorld { public static void main(String[] args) { System.out.println(„Hello world!“); } } // сега може void main() { System.out.println(„Hello, World!“); }
  • Добавен втори предварителен вариант на възможността, която позволява указване в конструкторите на изрази преди извикването на super(…), използвано за явно извикване на конструктора на родителския клас от конструктора на наследения клас, ако тези изрази не сочат към създавания от конструктора екземпляр. class Outer { void hello() { System.out.println(„Hello“); } class Inner { Inner() { hello(); super(); } } }
  • Добавена трета предварителна реализация на ограничените стойности (Scoped Values), която позволява съвместно използване на неизменяеми данни в потоци и ефективен обмен на данни между дъщерни потоци (стойностите се наследяват). Scoped Values се развиват с цел да заменят механизма на локалните за потока променливи (thread-local variables) и са по-ефективни при използване на много голям брой виртуални потоци (хиляди и милиони потоци). Основното отличие на Scoped Values от локалните за потока променливи е, че първите се записват веднъж, след което не могат да бъдат променяни и остават достъпни само за времето на изпълнението на потока.
  • Предложен за тестване третият предварителен вариант на API за структурирана паралелизъм (Structured Concurrency), който улеснява разработката на многопоточни приложения чрез обработка на няколко задачи, изпълнявани в различни нишки, като единен блок.
  • Обявени за остарели и планирани за премахване са методите за достъп до външна памет (извън JVM), предоставяни от класа sun.misc.Unsafe. За достъп до паметта извън купчината (off-heap) и взаимодействие с външен код се препоръчва използването на API VarHandle и API FFM (Foreign Function & Memory).

Допълнително може да се отбележи публикуването на актуализация на платформата за създаване на приложения с графичен интерфейс JavaFX 23 и включването в основния състав на Oracle JDK 23 JIT-компилатора GraalVM.

Също така е представен новият релиз на универсалната виртуална машина GraalVM, поддържаща стартирането на приложения на JavaScript (Node.js), Python, Ruby, R, всякакви езици за JVM (Java, Scala, Clojure, Kotlin) и езици, за които може да се генерира биткод LLVM (C, C++, Rust). Освен поддръжката на JDK 23, в новата версия е проведена оптимизация на потреблението на памет и размер на изпълняемия код, реализирана е пълна поддръжка на средствата за вграждане на Python и WebAssembly в Java-кода с използване на JIT-компилация.

Източник: opennet.ru

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster