Java SE 16-release

Na zes maanden ontwikkeling heeft Oracle Java SE 16 (Java Platform, Standard Edition 16) uitgebracht, dat het OpenJDK-project als referentie-implementatie gebruikt. Java SE 16 onderhoudt achterwaartse compatibiliteit met eerdere releases van het Java-platform; alle eerder geschreven Java-projecten zullen zonder wijzigingen werken wanneer ze onder de nieuwe versie worden gelanceerd. Kant-en-klare builds van Java SE 16 (JDK, JRE en Server JRE) zijn voorbereid voor Linux (x86_64, AArch64), Windows en macOS. De Java 16-referentie-implementatie, ontwikkeld door het OpenJDK-project, is volledig open source onder de GPLv2-licentie, met GNU ClassPath-uitzonderingen die dynamische koppeling met commerciële producten mogelijk maken.

Java SE 16 is geclassificeerd als een algemene ondersteuningsrelease en zal updates blijven ontvangen tot de volgende release. De Long Term Support (LTS)-tak zou Java SE 11 moeten zijn, die tot 2026 updates zal blijven ontvangen. De volgende LTS-release staat gepland voor september 2021. Laten we u eraan herinneren dat het project vanaf de release van Java 10 is overgestapt op een nieuw ontwikkelingsproces, wat een kortere cyclus voor de vorming van nieuwe releases inhield. Nieuwe functionaliteit wordt nu ontwikkeld in één voortdurend bijgewerkte masterbranch, die kant-en-klare wijzigingen bevat en waaruit elke zes maanden branches worden vertakt om nieuwe releases te stabiliseren.

Ter voorbereiding op de nieuwe release is de ontwikkeling verplaatst van het Mercurial-versiecontrolesysteem naar Git en het GitHub collaboratieve ontwikkelingsplatform. Verwacht wordt dat de migratie de prestaties van de repositorybewerkingen zal verbeteren, de opslagefficiëntie zal verhogen, toegang zal bieden tot wijzigingen gedurende de geschiedenis van het project, de ondersteuning voor codebeoordeling zal verbeteren en API's in staat zal stellen om workflows te automatiseren. Bovendien maakt het gebruik van Git en GitHub het project aantrekkelijker voor beginners en ontwikkelaars die gewend zijn aan Git.

Nieuwe functies in Java 16 zijn onder andere:

  • Experimentele module jdk.incubator.vector toegevoegd met een implementatie van de Vector API, die functies biedt voor vectorberekeningen die worden uitgevoerd met behulp van vectorinstructies op x86_64- en AArch64-processors en waarmee bewerkingen tegelijkertijd op meerdere waarden kunnen worden toegepast (SIMD). In tegenstelling tot de mogelijkheden van de HotSpot JIT-compiler voor automatische vectorisatie van scalaire bewerkingen, kunt u met de nieuwe API de vectorisatie voor parallelle gegevensverwerking expliciet regelen.
  • JDK- en VM HotSpot-code geschreven in C++ mag functies gebruiken die zijn geïntroduceerd in de C++14-specificatie. Voorheen waren C++98/03-standaarden toegestaan.
  • De ZGC (Z Garbage Collector), die in passieve modus werkt en vertragingen als gevolg van garbagecollection zoveel mogelijk minimaliseert, heeft de mogelijkheid toegevoegd om threadstapels parallel te verwerken zonder de applicatiethreads te pauzeren. De ZGC heeft nu alleen nog werk dat moet worden opgeschort en dat constante vertragingen kent, meestal niet groter dan een paar honderd microseconden.
  • Ondersteuning toegevoegd voor Unix-sockets (AF_UNIX) aan de klassen SocketChannel, ServerSocketChannel en java.nio.channels.
  • Voor de Linux-distributie Alpine is een port geïmplementeerd met de standaard C-bibliotheek musl, die populair is in omgevingen voor containers, microservices, cloud en embedded systemen. Dankzij de voorgestelde poort in dergelijke omgevingen kunt u Java-programma's uitvoeren zoals gewone toepassingen. Bovendien kunt u met behulp van jlink alle ongebruikte modules verwijderen en een minimale omgeving creëren die voldoende is om de applicatie uit te voeren, waardoor u applicatiespecifieke compacte images kunt maken.
  • Het Elastic Metaspace-mechanisme is geïmplementeerd, waardoor de bewerkingen van het toewijzen en retourneren van geheugen dat wordt ingenomen door klasse-metaspace (metaspace) in JVM HotSpot worden geoptimaliseerd. Het gebruik van Elastic Metaspace vermindert de geheugenfragmentatie, vermindert de overhead van de klassenlader en heeft ook een gunstig effect op de prestaties van langlopende servertoepassingen vanwege de snellere terugkeer van geheugen dat wordt ingenomen door ongebruikte klassenmetagegevens naar het besturingssysteem. Om de geheugenvrijgavemodus te selecteren na het ontladen van klassen, wordt de optie “-XX:MetaspaceReclaimPolicy=(balanced|aggressive|none)” aangeboden.
  • Er is een JDK-poort toegevoegd voor Windows-systemen die draaien op hardware met processors gebaseerd op de AArch64-architectuur.
  • Er is een derde preview van de Foreign-Memory Access API voorgesteld, waardoor Java-applicaties veilig en efficiënt toegang kunnen krijgen tot geheugengebieden buiten de Java-heap door de nieuwe MemorySegment-, MemoryAddress- en MemoryLayout-abstracties te manipuleren.
  • Er is een experimentele Foreign Linker API geïmplementeerd, die vanuit Java toegang biedt tot native code. Samen met de Foreign-Memory API maakt de nieuwe programmeerinterface het veel eenvoudiger om wrappers te maken dan conventionele gedeelde bibliotheken.
  • Het hulpprogramma jpackage toegevoegd, waarmee u pakketten voor op zichzelf staande Java-toepassingen kunt maken. Het hulpprogramma is gebaseerd op javapackager van JavaFX en stelt u in staat pakketten te maken in formaten die eigen zijn aan verschillende platforms (msi en exe voor Windows, pkg en dmg voor macOS, deb en rpm voor Linux). De pakketten bevatten alle vereiste afhankelijkheden.
  • Strikte inkapseling van alle JDK-internals is standaard ingeschakeld, met uitzondering van kritieke API's zoals sun.misc.Unsafe. De waarde van de optie “--illegal-access” is nu standaard ingesteld op “deny” in plaats van “permit”, waardoor pogingen van code om toegang te krijgen tot de meeste interne klassen, methoden en velden worden geblokkeerd. Om de beperking te omzeilen, gebruikt u de optie “-illegal-access=permit”.
  • De implementatie van patroonmatching in de operator “instanceof” is gestabiliseerd, waardoor u onmiddellijk een lokale variabele kunt definiëren die naar de gecontroleerde waarde verwijst. U kunt bijvoorbeeld onmiddellijk schrijven “if (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}” zonder expliciet “String s = (String) obj” te definiëren. Was: if (obj instanceof Group) { Groepsgroep = (Groep) obj; var vermeldingen = group.getEntries(); } Nu kunt u het doen zonder “Group group = (Group) obj” te definiëren: if (obj instanceof Group group) { var entrys = group.getEntries(); }
  • De implementatie van het trefwoord "record" is gestabiliseerd, waardoor een compacte vorm voor klassedefinities wordt geboden, waardoor het niet meer nodig is om verschillende methoden op laag niveau expliciet te definiëren, zoals equals(), hashCode() en toString() in gevallen waarin gegevens zijn opgeslagen alleen in velden waarmee het niet verandert. Wanneer een klasse standaardimplementaties van de methoden equals(), hashCode() en toString() gebruikt, kan deze het doen zonder hun expliciete definitie: public record BankTransaction(LocalDate date, double amount, String description) {}

    Deze declaratie voegt automatisch implementaties toe van de methoden equals(), hashCode() en toString() naast de methoden constructor en getter.

  • Er wordt een tweede concept voorgesteld voor verzegelde klassen en interfaces die niet door andere klassen en interfaces kunnen worden gebruikt om implementaties over te nemen, uit te breiden of te overschrijven. Verzegelde klassen bieden ook een meer declaratieve manier om het gebruik van een superklasse te beperken dan toegangsmodificatoren, gebaseerd op het expliciet opsommen van de subklassen die zijn toegestaan ​​voor uitbreiding. pakket com.voorbeeld.geometrie; openbare verzegelde klasse Vormvergunningen com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {…}

Bron: opennet.ru

Voeg een reactie