Udgivelse af Java SE 16

Efter seks måneders udvikling har Oracle udgivet platformen Java SE 16 (Java Platform, Standard Edition 16), hvor den referenceimplementering, der anvendes, er det åbne projekt OpenJDK. Java SE 16 bevarer bagudkompatibilitet med tidligere versioner af Java-platformen, så alle tidligere skrevne Java-projekter vil fungere uændret, når de kører på den nye version. Installerbare versioner af Java SE 16 (JDK, JRE og Server JRE) er forberedt til Linux (x86_64, AArch64), Windows og macOS. Den fra OpenJDK-projektet udviklede referenceimplementering af Java 16 er helt åben under GPLv2-licensen med undtagelser fra GNU ClassPath, der tillader dynamisk linking med kommercielle produkter.

Java SE 16 hører til kategorien udgivelser med almindelig supportperiode, opdateringer til den vil blive udgivet indtil næste udgivelse. For en version med langtidssupport (LTS) bør Java SE 11 anvendes, opdateringer til den vil blive udgivet indtil 2026. Den næste LTS-udgivelse er planlagt til september 2021. Vi minder om, at projektet siden udgivelsen af Java 10 er gået over til en ny udviklingsproces, der indebærer en kortere cyklus for nye udgivelser. Den nye funktionalitet udvikles nu i en konstant opdateret master-branch, hvor færdige ændringer inkluderes, og som der for hver sjette måned oprettes branches til stabilisering af nye udgivelser.

I forberedelsen af den nye udgivelse er udviklingen blevet flyttet fra versionsstyringssystemet Mercurial til Git og den fælles udviklingsplatform GitHub. Det forventes, at migrationen vil forbedre ydelsen ved operationer med repositoryet, øge effektiviteten af opbevaringen, sikre adgang til ændringer i hele projektets historie, forbedre understøttelsen af kodegennemgang og gøre det muligt at bruge API'er til at automatisere arbejdsprocesser. Desuden gør brugen af Git og GitHub projektet mere attraktivt for nybegyndere og udviklere, der er vant til Git.

Blandt nyhederne i Java 16 kan nævnes:

  • Der er tilføjet et eksperimentelt modul jdk.incubator.vector med en implementering af Vector API, som giver funktioner til vektorberegninger, der udføres ved hjælp af vektorinstruktionerne fra x86_64 og AArch64 processorerne, og som muliggør samtidig anvendelse af operationer på flere værdier (SIMD). I modsætning til de autofunksionaliteter, der tilbydes af JIT-kompilatoren HotSpot til auto-vectorisering af skalære operationer, giver det nye API mulighed for eksplicit kontrol over vektoriseringsprocessen for paralleldatakontrol.
  • I JDK- og VM HotSpot-koden, der er skrevet i C++, er det blevet tilladt at bruge funktioner, der er tilgængelige i C++14-specifikationen. Tidligere var kun C++98/03-standarder tilladt.
  • I ZGC (Z Garbage Collector), som fungerer i passiv tilstand og minimalt forsøger at reducere forsinkelser forårsaget af affaldsindsamling, er der tilføjet mulighed for paralleldatakontrol af trådstakke uden at pause applikationstrådenes udførelse. I ZGC er der nu kun tilbageholdelser, der kræver pauser, som typisk kun giver forsinkelser på et par hundrede mikrosekunder.
  • Der er tilføjet support til Unix-sockets (AF_UNIX) i klasserne SocketChannel, ServerSocketChannel og java.nio.channels.
  • Der er implementeret en port til Linux-distributionen Alpine med det standard C-bibliotek musl, der er populært i miljøer til containere, mikrotjenester, cloud-løsninger og indlejrede systemer. Den foreslåede port i sådan miljøer muliggør, at Java-programmer kan køre som almindelige applikationer. Desuden kan man med jlink fjerne alle ubrugte moduler og danne et minimalt miljø, der er tilstrækkeligt til at køre applikationen, hvilket gør det muligt at oprette kompakte billeder specifikt til bestemte applikationer.
  • Der er implementeret en mekanisme kaldet Elastic Metaspace, som optimerer operationerne til tildeling og frigivelse af hukommelse, der er optaget af klassernes metadata (metaspace) i JVM HotSpot. Anvendelsen af Elastic Metaspace reducerer hukommelsesfragmentering, mindsker overhead i klasseladeren og forbedrer desuden ydeevnen af langvarige serverapplikationer ved hurtigere at frigive hukommelse optaget af ubrugte klassedata til operativsystemet. Der er foreslået en mulighed "-XX:MetaspaceReclaimPolicy=(balanced|aggressive|none)" til valg af hukommelsesfrigivelsesmetode efter klasselæsning.
  • JDK-porten til Windows-systemer på hardware med AArch64-processorarkitektur er blevet tilføjet.
  • Et tredje tidligt forslag til API'et Foreign-Memory Access er blevet præsenteret, hvilket giver Java-applikationer mulighed for sikkert og effektivt at få adgang til hukommelsesområder uden for Java-hæ heap, ved at manipulere med de nye abstraktioner MemorySegment, MemoryAddress og MemoryLayout.
  • Et eksperimentelt API for Foreign Linker er blevet implementeret, som giver adgang fra Java til nativen kode. Sammen med API'et for Foreign-Memory forenkler det nye interface betydeligt oprettelsen af bindings til almindelige delte biblioteker.
  • Jpackage-værktøjet er blevet tilføjet, hvilket gør det muligt at oprette pakker til selvstændige Java-applikationer. Værktøjet er baseret på javapackager fra JavaFX og giver mulighed for at danne pakker i formater, der er native for forskellige platforme (msi og exe til Windows, pkg og dmg til macOS, deb og rpm til Linux). Pakkerne inkluderer alle nødvendige afhængigheder.
  • Streng indkapsling af alle interne elementer i JDK er nu aktiveret som standard, bortset fra kritiske API'er såsom sun.misc.Unsafe. Værdien af indstillingen «—illegal-access» er nu som standard sat til «deny» i stedet for «permit», hvilket vil blokere forsøg på at tilgå de fleste interne klasser, metoder og felter fra koden. For at omgå begrænsningen skal indstillingen «—illegal-access=permit» bruges.
  • Implementeringen af mønstermatchning i operatoren «instanceof» er blevet stabiliseret, hvilket gør det muligt at definere en lokal variabel til adgang til den validerede værdi med det samme. For eksempel kan man skrive «if (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}» uden at skulle definere «String s = (String) obj» eksplicit. Tidligere: if (obj instanceof Group) { Group group = (Group) obj; var entries = group.getEntries(); } Nu kan man klare sig uden at skulle definere «Group group = (Group) obj»: if (obj instanceof Group group) { var entries = group.getEntries(); }
  • Implementeringen af nøgleordet «record» er blevet stabiliseret, hvilket giver en kompakt form til at definere klasser og gør det muligt at undgå eksplicitte definitioner af forskellige lavniveau metoder som equals(), hashCode() og toString(), når data kun gemmes i felter, hvis adfærd ikke ændres. Når klassen bruger standardimplementeringer af metoderne equals(), hashCode() og toString(), kan den undgå deres eksplicitte definition: public record BankTransaction(LocalDate date, double amount, String description) {}

    Denne meddelelse vil automatisk føre til tilføjelse af implementeringerne af metoderne equals(), hashCode() og toString() samt konstruktøren og metoderne, der kontrollerer datamodifikation (getter).

  • En anden forhåndsvisning af 'sealed' klasser og interfaces, som ikke kan bruges af andre klasser og interfaces til arv, udvidelse eller overstyring af deres implementering, er blevet foreslået. 'Sealed' klasser giver desuden en mere deklarativ måde at begrænse brugen af superklassen på end adgangsmodifikatorer, der er baseret på en eksplicit opregning af de tilladte underklasser til udvidelse. package com.example.geometry; public sealed class Shape permits com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {…}

Kilde: opennet.ru

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster