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 թվականները): Java SE 11-ի LTS մասնաճյուղի հանրային աջակցությունն ավարտվեց անցյալ սեպտեմբերին, սակայն ընդլայնված աջակցությունը կշարունակվի մինչև 2032 թվականը: Java SE 8-ի LTS մասնաճյուղի ընդլայնված աջակցությունը կշարունակվի մինչև 2030 թվականը:

Հիշեցնենք, որ Java 10-ի թողարկումից սկսած՝ նախագիծն անցավ զարգացման նոր գործընթացի՝ ենթադրելով ավելի կարճ ցիկլ նոր թողարկումների ձևավորման համար։ Նոր ֆունկցիոնալությունն այժմ մշակվում է մեկ մշտապես թարմացվող գլխավոր մասնաճյուղում, որը ներառում է պատրաստի փոփոխություններ և որից մասնաճյուղերը ճյուղավորվում են յուրաքանչյուր վեց ամիսը մեկ՝ նոր թողարկումները կայունացնելու համար:

Java 22-ի նոր հնարավորությունները ներառում են.

  • G1 աղբահավաքիչը ներառում է տարածաշրջանի ամրացման աջակցություն, որը թույլ է տալիս ժամանակավորապես ամրագրել Java-ի օբյեկտների գտնվելու վայրը հիշողության մեջ՝ խուսափելու համար դրանք տեղափոխելուց աղբահանի կողմից և թույլ տալ, որ այդ օբյեկտների հղումները ապահով կերպով փոխանցվեն Java-ի և տեղական կոդի միջև: Ամրացնելը թույլ է տալիս նվազեցնել ուշացումը և խուսափել աղբի հավաքագրման անջատումից, երբ JNI-ի (Java Native Interface) կարևոր շրջաններն աշխատում են հայրենի կոդով (այս բաժինները կատարելիս JVM-ն չպետք է տեղափոխի դրանց հետ կապված կարևոր օբյեկտները՝ մրցավազքի պայմաններից խուսափելու համար): Ամրացնելը հեռացնում է կարևոր առարկաները աղբահանի տեսադաշտից, որը կարող է շարունակել մաքրել չամրացված տարածքները:
  • Ավելացվել է նախնական հատկություն՝ թույլ տալու համար արտահայտությունները կոնստրուկտորներում նշել նախքան super(...) կանչելը, որն օգտագործվում է ժառանգված դասի կոնստրուկտորից ծնող դասի կառուցողին բացահայտ կանչելու համար, եթե այդ արտահայտությունները չեն վերաբերում կառուցողի կողմից ստեղծված օրինակին: class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); սուպեր (); } }
  • FFM (Foreign Function & Memory) API-ն կայունացվել է՝ թույլ տալով Java ծրագրերի փոխազդեցությունը արտաքին կոդի և տվյալների հետ՝ կանչելով գործառույթներ արտաքին գրադարաններից և մուտք գործելով հիշողություն JVM-ից դուրս՝ առանց JNI (Java Native Interface) օգտագործման:
  • Միացված է անանուն փոփոխականների և օրինաչափությունների համընկնման աջակցությունը. զանգելիս չօգտագործված, բայց անհրաժեշտ փոփոխականների և օրինաչափությունների փոխարեն այժմ կարող եք նշել «_» նիշը: // was String pageName = switch (էջ) { case GitHubIssuePage(var url, var content, var links, int issueNumber) -> “ISSUE #” + issueNumber; ...}; // այժմ կարող եք String pageName = switch (էջ) { case GitHubIssuePage(_, _, _, int issueNumber) -> «ISSUE #» + issueNumber; };
  • Առաջարկվում է Class-File API-ի նախնական ներդրում Java դասի ֆայլերը վերլուծելու, գեներացնելու և փոխակերպելու համար: ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse (բայթ); բայթ[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) {if (!(ce instance of 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 դասին, գտնել և կազմել java ֆայլը և զանգահարել հիմնական մեթոդը:

  • Ավելացվեց String Templates-ի երկրորդ նախնական ներդրումը, որն իրականացվել է ի լրումն լարային բառացիների և տեքստային բլոկների: Լարային կաղապարները թույլ են տալիս միավորել տեքստը հաշվարկված արտահայտությունների և փոփոխականների հետ՝ առանց + օպերատորի օգտագործման։ Արտահայտությունների փոխարինումն իրականացվում է \{..} փոխարինումների միջոցով, և փոխարինված արժեքների ճիշտությունը ստուգելու համար կարելի է միացնել հատուկ մշակիչներ։ Օրինակ, SQL շարժիչը ստուգում է SQL կոդի մեջ փոխարինվող արժեքները և վերադարձնում է java.sql.Statement օբյեկտը որպես ելք, մինչդեռ JSON պրոցեսորը վերահսկում է JSON փոխարինումների ճիշտությունը և վերադարձնում JsonNode: String query = "SELECT * FROM Person p WHERE p." + հատկություն + " = '" + արժեք + "'"; // was Statement query = SQL."""SELECT * FROM Person p WHERE p.\{property} = '\{value}'"""; // դարձավ
  • Ավելացվել է Vector API-ի յոթերորդ նախադիտումը, որը տրամադրում է վեկտորային հաշվարկների գործառույթներ, որոնք կատարվում են x86_64 և AArch64 պրոցեսորների վրա վեկտորային հրահանգների միջոցով և թույլ են տալիս միաժամանակ կիրառվել բազմաթիվ արժեքների վրա (SIMD): Ի տարբերություն HotSpot JIT կոմպիլյատորում տրված հնարավորությունների՝ սկալյար գործողությունների ավտոմատ վեկտորացման համար, նոր API-ն հնարավորություն է տալիս բացահայտորեն վերահսկել վեկտորացումը տվյալների զուգահեռ մշակման համար:
  • Ավելացվել է ընդլայնված Stream API-ի նախնական ներդրումը, որն աջակցում է ձեր սեփական միջանկյալ գործողությունների սահմանմանը, ինչը կարող է օգտակար լինել այն դեպքերում, երբ առկա ներկառուցված միջանկյալ գործողությունները բավարար չեն տվյալների ցանկալի փոխակերպման համար: Բնական մշակողները միացված են 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]]
  • Փորձարկման համար առաջարկվել է Structured Concurrency-ի փորձնական API-ի երկրորդ տարբերակը, որը հեշտացնում է բազմաշերտ հավելվածների զարգացումը` մշակելով տարբեր թելերում կատարված բազմաթիվ առաջադրանքներ որպես մեկ բլոկի:
  • Ավելացվեց անուղղակիորեն հայտարարված դասերի և «հիմնական» մեթոդի անանուն օրինակների երկրորդ նախնական իրականացումը, որը կարող է հրաժարվել հրապարակային/ստատիկ հայտարարություններից, փաստարկների զանգվածի փոխանցումից և դասի հայտարարագրման հետ կապված այլ սուբյեկտներից: // was public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // այժմ կարող եք void main() { System.out.println("Բարև, աշխարհ!"); }
  • Ավելացրել է Scoped Values-ի երկրորդ նախադիտման իրականացումը, որը թույլ է տալիս անփոփոխ տվյալներ փոխանակել շղթաների միջով և արդյունավետորեն փոխանակել տվյալները մանկական շղթաների միջև (արժեքները ժառանգվում են): Scoped Values-ը մշակվում է՝ փոխարինելու thread-local variables մեխանիզմը և ավելի արդյունավետ են, երբ օգտագործում են շատ մեծ թվով վիրտուալ թելեր (հազար կամ միլիոնավոր թելեր): Scoped Values-ի և thread-local փոփոխականների միջև հիմնական տարբերությունն այն է, որ առաջինները գրվում են մեկ անգամ, ապագայում չեն կարող փոփոխվել և հասանելի են մնում միայն թելի կատարման տևողության ընթացքում:
  • Զուգահեռ աղբահավաքիչը բարելավել է աշխատանքը, երբ աշխատում է օբյեկտների մեծ զանգվածի հետ: Օպտիմալացումը թույլ տվեց որոշ թեստերում օբյեկտների մեծ զանգվածով նվազեցնել ուշացումը մինչև օբյեկտի որոնումը սկսելը 20%-ով:

Բացի այդ, կարող եք նշել JavaFX 22 գրաֆիկական ինտերֆեյսով հավելվածներ ստեղծելու հարթակի թարմացման հրապարակումը:

Source: opennet.ru

Добавить комментарий