Издаването на Java SE 24 и OpenJDK 24

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

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

В Java SE 24 се предлагат следните нововъведения:

  • Предложен е експериментален генеративен режим на работа на сборщика на боклук Shenandoah, при който се обработват отделно стари и новосъздадени обекти за повишаване на ефективността при почистването на обекти с малък жизнен цикъл. Новият режим осигурява по-предсказуема пропускна способност, устойчива на променливи натоварвания и намалено потребление на паметта при събиране на боклука. Планировчикът Shenandoah е насочен към намаляване на времето за спиране по време на събиране на боклука, като извършва по-голям обем работа паралелно с изпълнението на Java приложения.
  • В HotSpot JVM е реализирана експериментална поддръжка на компактни заглавия на обекти, размерът на които на 64-битови системи е намален от 96 на 64 бита (от 12 на 8 байта). Намаляването на размера на заглавията позволява да се намали размерът на купчината и да се увеличи ефективността на кеша.
  • В сборщика на отпадъци G1 е опростено реализирането на бариери, които следят достъпа на приложението до паметта. В новата версия операциите за разширение на бариерите са преместени на по-късен етап от компилацията в C2 JIT. Проведените тестове показват, че подобно преместване позволява да се намалят разходите в JIT компилатора C2 с 10-20% в зависимост от приложението.
  • Добавен е API за използване на криптографски функции за извеждане на ключове (KDF, key derivation function), които позволяват формирането на допълнителни ключове с необходимата дължина на базата на секретен ключ (например, парола) и произволен набор от данни. KDF API все още е в статут предварителна версия (preview).
  • Добавена е възможността за предварително (Ahead-of-Time) зареждане и компоновка на класове. Това изменение позволява ускоряване на стартирането на HotSpot JVM чрез предоставяне на използваните в приложението класове в вече заредено и композирано състояние. При първото стартиране на приложението състоянието на всички класове се запазва в кеша и при последващи стартирания се използва за ускоряване на зареждането.
  • Добавен е 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 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]]
  • Предложена четвърта предварителна реализация на ограничените стойности (Scoped Values), позволяваща съвместно използване на неизменяеми данни в потокове и ефективен обмен на данни между дъщерни потоци (стойностите се наследяват). Scoped Values се развиват, за да заместят механизма за локални променливи на потока (thread-local variables) и са по-ефективни при използване на много виртуални потоци (хиляди и милиони потоци). Основната разлика между Scoped Values и локалните променливи на потока е, че първите се записват веднъж, не могат да бъдат променяни и остават достъпни само по време на изпълнението на потока.
  • В механизмите за съвпадение с образец е добавена предварителна поддръжка за използване на примитивни типове (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 … }
  • Предложена девета предварителна реализация на API Vector, предоставящ функции за векторни изчисления, които се изпълняват с използване на векторни инструкции на процесори x86_64 и AArch64 и позволяват едновременно прилагане на операции върху няколко стойности (SIMD). В отличие от възможностите, предоставени от JIT компилатора HotSpot за автозависими скалярни операции, новият API дава възможност за явно управление на векторизацията за паралелна обработка на данни.
  • Реализирана е поддръжка за синхронизация на виртуални потоци без тяхното прикрепяне (pinning) към потоци, свързани с платформата. Виртуалните потоци в синхронизирания метод или израз в състояние на блокировка сега освобождават своя платформен поток, позволявайки на други виртуални потоци да го използват, което значително увеличава броя на достъпните виртуални потоци и подобрява мащабируемостта на приложения, използващи многопоточност.
  • Добавен третият предварителен вариант на възможността, позволяваща указване в конструктора на изрази преди извикването на super(...), използвано за явното извикване на конструктора на родителския клас от конструктора на наследения клас, ако тези изрази не се отнасят за създадения от конструктора екземпляр. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } } }
  • В утилитата jlink е реализирана поддръжка за създаване на изображения run-time без използването на файлове JMOD, което позволява намаляване на размера на JDK с приблизително 25%.
  • Добавен е вторият предварителен вариант за използване на едно изразяване „import module M“ за импортиране веднага на всички пакети, експортирани от посочения модул. Това изменение значително улеснява повторното използване на модулни библиотеки, позволявайки свързването на библиотеки и класове без определяне на тяхното място в йерархията на пакетите. Например, указването на „import module java.base“ ще доведе до импортиране на всички 54 пакета, включени в модула java.base, които преди това трябваше да се споменават поотделно („import java.io.*“, „import java.util.*“ и т.н.).
  • Добавена е четвъртата предварителна реализация на неявно обявени класове и безименни екземпляри на метода „main“, в които може да се обходите без обявления public/static, предаване на масив от аргументи и други свързани с обявлението на класа елементи. // преди public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // сега може void main() { System.out.println("Hello, World!"); }
  • Предложен за тестване е четвъртият предварителен вариант на API за структурирана паралелизъм (Structured Concurrency), опростяващ разработката на многопоточни приложения чрез обработка на няколко задачите, изпълнявани в различни потоци, като единен блок.
  • В API KeyPairGenerator, Signature и KeyFactory е добавена поддръжка за алгоритми ML-KEM (CRYSTALS-Kyber) и ML-DSA (CRYSTALS-Dilithium), стандартизирани от Националния институт за стандарти и технологии на САЩ (NIST) и устойчиви на подбране на квантов компютър. Тези алгоритми използват криптографски методи, основани на решаване на задачи от теорията на решетките, времето за решаване на които не се различава на обикновени и квантови компютри.
  • В сборщика на бок ZGC е премахната поддръжката на негенеративния режим на работа, който не разделя обработката на "стари" и "млади" обекти. От Java SE 23, генеративният режим ZGC се използва по подразбиране.
  • Добавено е извеждането на предупреждения за използване на API JNI (Java Native Interface) и FFM (Foreign Function & Memory) с цел подготовка на разработчиците за ограничен достъп до тези API в бъдещи версии, когато бъде включен режимът на осигуряване на целостта, който по подразбиране забранява взаимодействието с нативен код.
  • Включено е извеждането на предупреждение при използване на методи за достъп до външна памет (извън JVM), предоставяни от класа sun.misc.Unsafe. За достъп до памет извън купчината (off-heap) и взаимодействие с външен код, се препоръчва да се използва API VarHandle. В предишната версия поддръжката на sun.misc.Unsafe беше обявена за остаряла.
  • Изключен е Security Manager, който отдавна е загубил актуалност и няма търсене след прекратяване на поддръжката на браузърния плъгин. Security Manager беше класифициран като остарял в Java 17. В една от следващите версии е планирано напълно да се премахне кодът на Security Manager.
  • Премахнат е кодът за поддръжка на 32-битни платформи на Windows в системи x86. Портът на Java за 32-битови системи x86 е обявен за остарял и планирано е да бъде премахнат (поддръжката на Linux на 32-битови системи x86 ще бъде прекратена).

Допълнително може да се отбележи публикуването на обновлението на платформата за разработка на приложения с графичен интерфейс JavaFX 24 и нова версия на универсалната виртуална машина GraalVM, която поддържа изпълнението на приложения на JavaScript (Node.js), Python, Ruby, R, всякакви езици за JVM (Java, Scala, Clojure, Kotlin) и езици, за които може да се генерира биткод LLVM (C, C++, Rust). Освен поддръжката на JDK 24 в новата версия на GraalVM са проведени оптимизации за задачи, свързани с машинно обучение, подобрена е поддръжката на компилирането на Java байткод в машинен код, добавен е механизъм SkipFlow за намаляване на размера на изпълняемите файлове и намаляване на времето за компилация.

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

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