Пасля шасці месяцаў распрацоўкі кампанія 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.

- Механізмы супастаўлення з узорам пашыраны папярэдняй падтрымкай выкарыстання прымітыўных тыпаў (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

