Java SE 16 release

Efter sex månaders utveckling släppte Oracle Java SE 16 (Java Platform, Standard Edition 16), som använder OpenJDK-projektet med öppen källkod som referensimplementering. Java SE 16 upprätthåller bakåtkompatibilitet med tidigare versioner av Java-plattformen; alla tidigare skrivna Java-projekt kommer att fungera utan ändringar när de lanseras under den nya versionen. Installationsfärdiga versioner av Java SE 16 (JDK, JRE och Server JRE) är förberedda för Linux (x86_64, AArch64), Windows och macOS. Utvecklad av OpenJDK-projektet är Java 16-referensimplementeringen helt öppen källkod under GPLv2-licensen, med GNU ClassPath-undantag som tillåter dynamisk länkning med kommersiella produkter.

Java SE 16 är klassificerad som en allmän supportversion och kommer att fortsätta att ta emot uppdateringar fram till nästa release. LTS-grenen (Long Term Support) bör vara Java SE 11, som kommer att fortsätta att ta emot uppdateringar fram till 2026. Nästa LTS-release är planerad till september 2021. Låt oss påminna dig om att från och med lanseringen av Java 10 gick projektet över till en ny utvecklingsprocess, vilket innebär en kortare cykel för bildandet av nya utgåvor. Ny funktionalitet utvecklas nu i en ständigt uppdaterad mastergren, som inkluderar färdiga ändringar och från vilka grenar förgrenas var sjätte månad för att stabilisera nya releaser.

Som förberedelse för den nya utgåvan har utvecklingen flyttats från Mercurials versionskontrollsystem till Git och GitHubs samarbetsutvecklingsplattform. Migreringen förväntas förbättra prestandan för förvarsoperationer, öka lagringseffektiviteten, ge tillgång till förändringar genom hela projektets historia, förbättra stödet för kodgranskning och göra det möjligt för API:er att automatisera 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.

Nya funktioner i Java 16 inkluderar:

  • Lade till experimentmodulen jdk.incubator.vector med en implementering av Vector API, som tillhandahåller funktioner för vektorberäkningar som utförs med hjälp av vektorinstruktioner på x86_64- och AArch64-processorer och tillåter operationer att appliceras samtidigt på flera värden (SIMD). I motsats till funktionerna i HotSpot JIT-kompilatorn för autovektorisering av skalära operationer, tillåter det nya API:et dig att explicit styra vektorisering för parallell databehandling.
  • JDK och VM HotSpot-kod skriven i C++ är tillåten att använda funktioner som introduceras i C++14-specifikationen. Tidigare var C++98/03-standarder tillåtna.
  • ZGC (Z Garbage Collector), som arbetar i passivt läge och minimerar förseningar på grund av sophämtning så mycket som möjligt, har lagt till möjligheten att bearbeta trådstaplar parallellt utan att pausa applikationstrådar. ZGC har nu bara arbete som kräver avstängning, som har konstanta fördröjningar, vanligtvis inte överstigande några hundra mikrosekunder.
  • Lade till stöd för Unix-sockets (AF_UNIX) till klasserna SocketChannel, ServerSocketChannel och java.nio.channels.
  • En port har implementerats för Linux-distributionen Alpine med standard C-biblioteket musl, som är populärt i miljöer för containrar, mikrotjänster, moln och inbyggda system. Den föreslagna porten i sådana miljöer låter dig köra Java-program som vanliga applikationer. Dessutom kan du med hjälp av jlink ta bort alla oanvända moduler och skapa en minimal miljö som är tillräcklig för att köra applikationen, vilket gör att du kan skapa applikationsspecifika kompakta bilder.
  • Mekanismen Elastic Metaspace har implementerats, vilket optimerar operationerna för att allokera och returnera minne som upptas av klassmetadata (metaspace) i JVM HotSpot. Användningen av Elastic Metaspace minskar minnesfragmentering, minskar klassladdningsoverhead och har också en gynnsam effekt på prestanda för långvariga serverapplikationer på grund av snabbare återgång av minne som upptas av oanvänd klassmetadata till operativsystemet. För att välja minnesfrigöringsläge efter att klasserna har laddats ur, erbjuds alternativet "-XX:MetaspaceReclaimPolicy=(balanserad|aggressiv|ingen)".
  • En JDK-port har lagts till för Windows-system som körs på hårdvara med processorer baserade på AArch64-arkitekturen.
  • En tredje förhandsvisning av Foreign-Memory Access API har föreslagits, vilket tillåter Java-applikationer att säkert och effektivt komma åt minnesregioner utanför Java-högen genom att manipulera de nya MemorySegment-, MemoryAddress- och MemoryLayout-abstraktionerna.
  • Ett experimentellt Foreign Linker API har implementerats, vilket ger åtkomst från Java till inbyggd kod. Tillsammans med Foreign-Memory API gör det nya programmeringsgränssnittet det mycket lättare att skapa omslag över konventionella delade bibliotek.
  • Lade till verktyget jpackage, som låter dig skapa paket för fristående Java-applikationer. Verktyget är baserat på javapackager från JavaFX och låter dig skapa paket i format som är inbyggda i olika plattformar (msi och exe för Windows, pkg och dmg för macOS, deb och rpm för Linux). Paketen innehåller alla nödvändiga beroenden.
  • Strikt inkapsling av alla JDK-interna delar är aktiverat som standard, med undantag för kritiska API:er som sun.misc.Unsafe. Värdet på alternativet "--illegal-access" är nu inställt på "deny" istället för "permit" som standard, vilket kommer att blockera försök från kod för att komma åt de flesta interna klasser, metoder och fält. För att kringgå begränsningen, använd alternativet "-illegal-access=permit".
  • Implementeringen av mönstermatchning i operatorn "instanceof" har stabiliserats, vilket gör att du omedelbart kan definiera en lokal variabel för att referera till det kontrollerade värdet. Till exempel kan du omedelbart skriva "if (obj instans av String s && s.length() > 5) {.. s.contains(..) ..}" utan att uttryckligen definiera "String s = (String) obj". Var: if (obj instansof Group) { Group group = (Group) obj; var entries = group.getEntries(); } Nu kan du göra utan att definiera "Grupp grupp = (Grupp) obj": if (obj instans av gruppgrupp) { var entries = group.getEntries(); }
  • Implementeringen av nyckelordet "record" har stabiliserats, vilket ger en kompakt form för klassdefinitioner som eliminerar behovet av att explicit definiera olika lågnivåmetoder som equals(), hashCode() och toString() i de fall data lagras endast i fält som det inte ändras med. När en klass använder standardimplementationer av metoderna equals(), hashCode() och toString() kan den klara sig utan deras explicita definition: public record BankTransaction(LocalDate date, double amount, String description) {}

    Den här deklarationen kommer automatiskt att lägga till implementeringar av metoderna equals(), hashCode() och toString() utöver konstruktor- och gettermetoderna.

  • Ett andra utkast föreslås för förseglade klasser och gränssnitt som inte kan användas av andra klasser och gränssnitt för att ärva, utöka eller åsidosätta implementeringar. Förseglade klasser ger också ett mer deklarativt sätt att begränsa användningen av en superklass än åtkomstmodifierare, baserat på att explicit lista de underklasser som tillåts för förlängning. paket com.example.geometry; offentlig förseglad klass Form tillåter com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {…}

Källa: opennet.ru

Lägg en kommentar