Java SE 16-ի թողարկում

Վեց ամիս մշակումից հետո Oracle-ը թողարկեց Java SE 16-ը (Java Platform, Standard Edition 16), որն օգտագործում է OpenJDK նախագիծը որպես հղման իրականացում։ Java SE 16-ը պահպանում է հետամնաց համատեղելիությունը Java պլատֆորմի նախորդ թողարկումների հետ; բոլոր նախկինում գրված Java նախագծերը կաշխատեն առանց փոփոխությունների, երբ գործարկվեն նոր տարբերակով: Java SE 16-ի (JDK, JRE և Server JRE) պատրաստի տեղադրման կառուցումները պատրաստված են Linux-ի (x86_64, AArch64), Windows-ի և macOS-ի համար: OpenJDK նախագծի կողմից մշակված Java 16 հղումների իրականացումը լիովին բաց կոդով է GPLv2 լիցենզիայի ներքո, GNU ClassPath բացառություններով, որոնք թույլ են տալիս դինամիկ կապ հաստատել առևտրային արտադրանքների հետ:

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

Նախապատրաստվելով նոր թողարկմանը՝ մշակումը Mercurial տարբերակի կառավարման համակարգից տեղափոխվել է Git և GitHub համագործակցային զարգացման հարթակ: Ակնկալվում է, որ միգրացիան կբարելավի պահեստի գործառնությունները, կբարձրացնի պահեստավորման արդյունավետությունը, թույլ կտա մուտք գործել դեպի փոփոխությունների նախագծի ողջ պատմության ընթացքում, կբարելավի կոդերի վերանայման աջակցությունը և հնարավորություն կտա API-ներին ավտոմատացնել աշխատանքային հոսքերը: Բացի այդ, Git-ի և GitHub-ի օգտագործումը նախագիծն ավելի գրավիչ է դարձնում սկսնակների և Git-ին սովոր ծրագրավորողների համար:

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

  • Ավելացվեց jdk.incubator.vector փորձնական մոդուլը Vector API-ի ներդրմամբ, որն ապահովում է վեկտորային հաշվարկների գործառույթներ, որոնք կատարվում են x86_64 և AArch64 պրոցեսորների վրա վեկտորային հրահանգների միջոցով և թույլ են տալիս միաժամանակ կիրառվել բազմաթիվ արժեքների վրա (SIMD): Ի տարբերություն HotSpot JIT կոմպիլյատորում տրված հնարավորությունների՝ սկալյար գործողությունների ավտոմատ վեկտորացման համար, նոր API-ն թույլ է տալիս բացահայտորեն վերահսկել վեկտորացումը տվյալների զուգահեռ մշակման համար:
  • JDK և VM HotSpot կոդը, որը գրված է C++-ով, թույլատրվում է օգտագործել C++14 բնութագրում ներկայացված հնարավորությունները: Նախկինում թույլատրվում էին C++98/03 ստանդարտները:
  • ZGC-ն (Z Garbage Collector), որն աշխատում է պասիվ ռեժիմով և հնարավորինս նվազագույնի է հասցնում աղբահանության հետ կապված ձգձգումները, ավելացրել է թելերի կույտերը զուգահեռ մշակելու հնարավորությունը՝ առանց կիրառական թելերը դադարեցնելու: ZGC-ն այժմ ունի միայն կասեցում պահանջող աշխատանք, որն ունի մշտական ​​ուշացումներ, որոնք սովորաբար չեն գերազանցում մի քանի հարյուր միկրովայրկյան:
  • Ավելացվել է աջակցություն Unix վարդակների համար (AF_UNIX) SocketChannel, ServerSocketChannel և java.nio.channels դասերին:
  • Linux-ի Alpine բաշխման համար ներդրվել է մի նավահանգիստ C գրադարանի ստանդարտ musl-ով, որը հայտնի է բեռնարկղերի, միկրոծառայությունների, ամպային և ներկառուցված համակարգերի միջավայրերում: Նման միջավայրերում առաջարկվող նավահանգիստը թույլ է տալիս գործարկել Java ծրագրերը, ինչպես սովորական հավելվածները: Բացի այդ, օգտագործելով jlink-ը, դուք կարող եք հեռացնել բոլոր չօգտագործված մոդուլները և ստեղծել հավելվածը գործարկելու համար բավարար միջավայր, որը թույլ է տալիս ստեղծել հավելվածի համար հատուկ կոմպակտ պատկերներ:
  • Իրականացվել է Elastic Metaspace մեխանիզմը, որն օպտիմալացնում է JVM HotSpot-ում դասի մետատվյալներով (metaspace) զբաղեցրած հիշողության տեղաբաշխման և վերադարձման գործողությունները: Elastic Metaspace-ի օգտագործումը նվազեցնում է հիշողության մասնատվածությունը, նվազեցնում է դասի բեռնիչի ծախսը, ինչպես նաև բարենպաստ ազդեցություն է ունենում երկարաժամկետ սերվերի հավելվածների աշխատանքի վրա՝ չօգտագործված դասի մետատվյալներով օպերացիոն համակարգին զբաղեցրած հիշողության ավելի արագ վերադարձի պատճառով: Դասերի բեռնաթափումից հետո հիշողության թողարկման ռեժիմն ընտրելու համար առաջարկվում է «-XX:MetaspaceReclaimPolicy=(հավասարակշռված|ագրեսիվ|չկան)» տարբերակը:
  • AArch64 ճարտարապետության վրա հիմնված պրոցեսորներով Windows համակարգերի համար ավելացվել է JDK պորտ:
  • Առաջարկվել է Foreign-Memory Access API-ի երրորդ նախադիտումը, որը թույլ է տալիս Java հավելվածներին ապահով և արդյունավետ մուտք գործել հիշողության տարածքներ Java կույտից դուրս՝ շահարկելով MemorySegment, MemoryAddress և MemoryLayout նոր աբստրակցիաները:
  • Իրականացվել է փորձարարական Foreign Linker API, որը Java-ից մուտք է ապահովում հայրենի կոդ: Foreign-Memory API-ի հետ միասին ծրագրավորման նոր ինտերֆեյսը շատ ավելի հեշտ է դարձնում սովորական ընդհանուր գրադարանների վրա փաթաթաներ ստեղծելը:
  • Ավելացվեց jpackage կոմունալ ծրագիրը, որը թույլ է տալիս ստեղծել փաթեթներ ինքնուրույն Java հավելվածների համար: Կոմունալը հիմնված է JavaFX-ից javapackager-ի վրա և թույլ է տալիս ստեղծել փաթեթներ տարբեր հարթակներում բնօրինակ ձևաչափերով (msi և exe Windows-ի համար, pkg և dmg macOS-ի համար, deb և rpm Linux-ի համար): Փաթեթները ներառում են բոլոր անհրաժեշտ կախվածությունները:
  • JDK-ի բոլոր ինտերիերի խիստ ընդգրկումը լռելյայն միացված է, բացառությամբ կարևոր API-ների, ինչպիսիք են sun.misc.Unsafe: «--անօրինական մուտք» տարբերակի արժեքը լռելյայնորեն այժմ դրված է «մերժել»՝ «թույլտվության» փոխարեն, որը կփակի ներքին դասերի, մեթոդների և դաշտերի մեծամասնությանը մուտք գործելու կոդի փորձերը: Սահմանափակումը շրջանցելու համար օգտագործեք «-ilegal-access=permit» տարբերակը:
  • «Instanceof» օպերատորում օրինաչափությունների համապատասխանության իրականացումը կայունացվել է, ինչը թույլ է տալիս անմիջապես սահմանել տեղական փոփոխական՝ ստուգված արժեքին հղում կատարելու համար: Օրինակ, դուք կարող եք անմիջապես գրել «if (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}» առանց հստակ սահմանելու «String s = (String) obj»: Եղել է. if (obj instanceof Group) { Group group = (Group) obj; var մուտքեր = group.getEntries(); } Այժմ դուք կարող եք անել առանց «Group group = (Group) obj» սահմանելու. if (obj instanceof Group group) { var entries = group.getEntries(); }
  • «Record» հիմնաբառի իրականացումը կայունացվել է՝ ապահովելով դասերի սահմանումների կոմպակտ ձև, որը վերացնում է ցածր մակարդակի տարբեր մեթոդների հստակ սահմանման անհրաժեշտությունը, ինչպիսիք են equals(), hashCode() և toString() տվյալները, երբ տվյալները պահվում են: միայն դաշտերում, որոնց հետ այն չի փոխվում։ Երբ դասը օգտագործում է equals(), hashCode() և toString() մեթոդների ստանդարտ իրականացումները, այն կարող է անել առանց դրանց հստակ սահմանման՝ հանրային գրառում BankTransaction (LocalDate date, կրկնակի գումար, String նկարագրություն) {}

    Այս հայտարարությունը ավտոմատ կերպով կավելացնի հավասար(), hashCode() և toString() մեթոդների իրականացումները՝ ի լրումն կառուցողի և ստացողի մեթոդների:

  • Երկրորդ նախագիծն առաջարկվում է կնքված դասերի և ինտերֆեյսների համար, որոնք չեն կարող օգտագործվել այլ դասերի և միջերեսների կողմից՝ ժառանգելու, ընդլայնելու կամ անտեսելու իրականացումները: Կնքված դասերը նաև ապահովում են գերդասերի օգտագործումը սահմանափակելու ավելի դեկլարատիվ եղանակ, քան մուտքի մոդիֆիկատորները՝ հիմնվելով ընդլայնման համար թույլատրված ենթադասերի հստակ ցուցակագրման վրա: փաթեթ com.example.geometry; հանրային կնքված դասի Shape permits com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {…}

Source: opennet.ru

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