Efter sex mÄnaders utveckling har Oracle lanserat plattformen Java SE 16 (Java Platform, Standard Edition 16), vars referensimplementering Àr det öppna projektet OpenJDK. Java SE 16 behÄller bakÄtkompatibilitet med tidigare versioner av Java-plattformen, och alla tidigare skrivna Java-projekt kommer att fungera utan Àndringar nÀr de körs med den nya versionen. InstallationsfÀrdiga byggnader av Java SE 16 (JDK, JRE och Server JRE) Àr förberedda för Linux (x86_64, AArch64), Windows och macOS. Den referensimplementering av Java 16 som utvecklats inom ramen för OpenJDK-projektet Àr helt öppen under GPLv2-licensen med undantag för GNU ClassPath som tillÄter dynamisk lÀnkning mot kommersiella produkter.
Java SE 16 klassificeras som en version med normal supportperiod, med uppdateringar som kommer att slÀppas fram till nÀsta version. För en version med lÄngsiktig support (LTS) ska Java SE 11 anvÀndas, med uppdateringar som kommer att slÀppas fram till 2026. NÀsta LTS-version Àr planerad till september 2021. Vi pÄminner om att projektet har övergÄtt till en ny utvecklingsprocess sedan slÀppet av Java 10, vilket innebÀr en kortare cykel för nya versioner. Den nya funktionaliteten utvecklas nu i en stÀndigt uppdaterad master-gren, dÀr fÀrdiga Àndringar inkluderas och frÄn vilken grenar för stabilisering av nya utgÄvor avvikas var sjÀtte mÄnad.
Vid förberedelsen av den nya versionen har utvecklingen övergÄtt frÄn versionshanteringssystemet Mercurial till Git och plattformen för samarbete GitHub. Det förvÀntas att migrationen kommer att öka prestandan för operationer med förrÄdet, förbÀttra lagringseffektiviteten, ge tillgÄng till Àndringar genom hela projektets historia, förbÀttra stödet för kodgranskning och aktivera API för automatisering av arbetsflöden. Dessutom gör anvÀndningen av Git och GitHub projektet mer attraktivt för nybörjare och utvecklare som Àr vana vid Git.
Bland nyheterna i Java 16 kan nÀmnas:
- En experimentell modul jdk.incubator.vector har lagts till med en implementering av API:et Vector, som tillhandahÄller funktioner för vektorberÀkningar som utförs med hjÀlp av vektorinstruktioner frÄn processorerna x86_64 och AArch64. Detta möjliggör samtidig tillÀmpning av operationer pÄ flera vÀrden (SIMD). Till skillnad frÄn de funktioner för automatisk vektorisering av skalÀra operationer som tillhandahÄlls av JIT-kompilatorn HotSpot, tillÄter det nya API:et explicit kontroll över vektoriseringen för parallell databehandling.
- I JDK- och VM-koden för HotSpot, skriven i C++, Àr anvÀndning av funktioner som introducerats i C++14-specifikationen nu tillÄten. Tidigare var endast C++98/03-standarder tillÄtna.
- Den passiva skrÀphanteraren ZGC (Z Garbage Collector) har fÄtt möjlighet till parallell behandling av trÄdarnas stackar utan att stoppa körningen av applikationstrÄdarna. I ZGC ÄterstÄr nu endast de som krÀver stopp av arbetet, vilka vanligtvis har konstanta fördröjningar som sÀllan överstiger nÄgra hundra mikrosekunder.
- I klasserna SocketChannel, ServerSocketChannel och java.nio.channels har stöd för Unix-sockets (AF_UNIX) lagts till.
- En port för Linux-distributionen Alpine med standard C-biblioteket musl, som Àr populÀr i container-, mikrotjÀnst-, moln- och inbÀddade system, har implementerats. Den föreslagna porten tillÄter körning av Java-program som vanliga applikationer i sÄdana miljöer. Dessutom kan jlink anvÀndas för att ta bort alla oanvÀnda moduler och skapa en minimal miljö som Àr tillrÀcklig för att köra applikationen, vilket möjliggör skapandet av kompaktanpassade bilder för specifika applikationer.
- En mekanism för Elastic Metaspace har implementerats, vilket optimerar allokering och ÄterlÀmning av minne som anvÀnds av klassmetadata (metaspace) i JVM HotSpot. AnvÀndningen av Elastic Metaspace minskar minnesfragmentering, minskar overheaden i klassladdaren och har en positiv effekt pÄ prestandan hos serverapplikationer som körs under lÀngre tid, genom snabbare ÄterlÀmning av minne till operativsystemet som anvÀnds av oanvÀnd klassmetadata. För att vÀlja minnesfrigöringslÀge efter avladdning av klasser har alternativet "-XX:MetaspaceReclaimPolicy=(balanced|aggressive|none)" föreslagits.
- JDK-porten har lagts till för Windows-system som kör pÄ processorer med AArch64-arkitektur.
- Ett tredje preliminÀrt förslag pÄ API:t Foreign-Memory Access har föreslagits, vilket gör det möjligt för Java-applikationer att sÀkert och effektivt fÄ tillgÄng till minnesomrÄden utanför Java-högen genom att manipulera nya abstraktioner som MemorySegment, MemoryAddress och MemoryLayout.
- Ett experimentellt API för Foreign Linker har implementerats, vilket ger Java-tillgÄng till nativ kod. Tillsammans med API:t Foreign-Memory förenklar det nya programgrÀnssnittet avsevÀrt skapandet av bindningar till vanliga delade bibliotek.
- Verktyget jpackage har lagts till, vilket möjliggör skapandet av paket för sjÀlvstÀndiga Java-applikationer. Verktyget bygger pÄ javapackager frÄn JavaFX och gör det möjligt att skapa paket i format som Àr inhemska för olika plattformar (msi och exe för Windows, pkg och dmg för macOS, deb och rpm för Linux). Paketen inkluderar alla nödvÀndiga beroenden.
- StrĂ€ng inkapsling av alla interna element i JDK Ă€r nu aktiverad som standard, förutom kritiska API:er som sun.misc.Unsafe. VĂ€rdet pĂ„ alternativet "âillegal-access" Ă€r nu som standard instĂ€llt pĂ„ "deny" istĂ€llet för "permit", vilket kommer att blockera försök att fĂ„ tillgĂ„ng till de flesta interna klasser, metoder och fĂ€lt frĂ„n kod. För att kringgĂ„ begrĂ€nsningen bör alternativet "âillegal-access=permit" anvĂ€ndas.
- Implementeringen av mönstermatchning i "instanceof"-operatorn har stabiliserats, vilket gör det möjligt att omedelbart definiera en lokal variabel för att referera till det kontrollerade vÀrdet. Till exempel kan man skriva "if (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}" utan att uttryckligen definiera "String s = (String) obj". Tidigare: if (obj instanceof Group) { Group group = (Group) obj; var entries = group.getEntries(); } Nu kan man undvika att definiera "Group group = (Group) obj": if (obj instanceof Group group) { var entries = group.getEntries(); }
- Implementeringen av nyckelordet "record" har stabiliserats, vilket ger en kompakt form för klassdefinitioner och gör det möjligt att undvika uttrycklig definition av olika lÄgnivÄmetoder som equals(), hashCode() och toString() i fall dÀr data endast lagras i fÀlt och dÀr beteendet för dessa inte Àndras. NÀr en klass anvÀnder typiska implementationer av metoderna equals(), hashCode() och toString() kan den klara sig utan att uttryckligen definiera dem: public record BankTransaction(LocalDate date, double amount, String description) {}
Denna deklaration kommer att leda till automatisk tillÀgg av implementationerna av metoderna equals(), hashCode() och toString() utöver konstruktorn och metoderna som kontrollerar dataÀndringar (getter).
- Ett andra preliminĂ€rt förslag pĂ„ förseglade ("sealed") klasser och grĂ€nssnitt har presenterats, som inte kan anvĂ€ndas av andra klasser och grĂ€nssnitt för arv, utökning eller överskrivning av implementation. Förseglade klasser erbjuder ocksĂ„ ett mer deklarativt sĂ€tt att begrĂ€nsa anvĂ€ndningen av superklassen, jĂ€mfört med Ă„tkomstmodifikatorer, baserat pĂ„ en tydlig förteckning över underklasser som fĂ„r utökas. package com.example.geometry; public sealed class Shape permits com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {âŠ}
KĂ€lla: opennet.ru
