Выпуск Java SE 23 і OpenJDK 23

Пасля шасці месяцаў распрацоўкі кампанія Oracle апублікавала платформу Java SE 23 (Java Platform, Standard Edition 23), у якасці эталоннай рэалізацыі якой выкарыстоўваецца адчынены праект OpenJDK. Гатовыя для ўстаноўкі зборкі Java SE 23 (JDK, JRE і Server JRE) падрыхтаваны для Linux (x22_86, AArch64), Windows (x64_86) і macOS (x64_86, AArch64) Распрацаваная ў рамках праекта OpenJDK эталонная рэалізацыя Java 64 цалкам адкрытая якія дазваляюць дынамічнае звязванне з камерцыйнымі прадуктамі.

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 паказала павелічэнне прапускной здольнасці ў 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()) } });

  • Прапанавана восьмая папярэдняя рэалізацыя API Vector, які прадстаўляе функцыі для вектарных вылічэнняў, якія выконваюцца з выкарыстаннем вектарных інструкцый працэсараў x86_64 і AArch64 і дазваляюць адначасова прымяніць аперацыі адразу да некалькіх значэнняў (SIMD). У адрозненне ад якія прадстаўляюцца ў JIT-кампілятары HotSpot магчымасцяў па аўтавектарызацыі скалярных аперацый, новы API дае магчымасць відавочна кіраваць вектарызацыі для паралельнай апрацоўкі дадзеных.
  • У клас java.io.Console дададзены метады format, printf, readPassword і readLine для фарматавання, вываду і чытання тэксту з улікам абранай лакалі.
  • Дададзена другая папярэдняя рэалізацыя пашыранага 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м23). памяці і памеру выкананага кода, рэалізаваная паўнавартасная падтрымка сродкаў для ўбудавання Python і WebAssembly у Java-код з выкарыстаннем JIT-кампіляцыі.

Крыніца: opennet.ru

Дадаць каментар