Versione Java SE 16

Dopo sei mesi di sviluppo, Oracle ha rilasciato Java SE 16 (Java Platform, Standard Edition 16), che utilizza il progetto OpenJDK come implementazione di riferimento. Java SE 16 mantiene la compatibilità con le versioni precedenti della piattaforma Java; tutti i progetti Java scritti in precedenza funzioneranno senza modifiche una volta lanciati con la nuova versione. Le build pronte per l'installazione di Java SE 16 (JDK, JRE e Server JRE) sono preparate per Linux (x86_64, AArch64), Windows e macOS. Sviluppata dal progetto OpenJDK, l'implementazione di riferimento Java 16 è completamente open source con licenza GPLv2, con eccezioni GNU ClassPath che consentono il collegamento dinamico con prodotti commerciali.

Java SE 16 è classificato come rilascio di supporto generale e continuerà a ricevere aggiornamenti fino al rilascio successivo. Il ramo Long Term Support (LTS) dovrebbe essere Java SE 11, che continuerà a ricevere aggiornamenti fino al 2026. La prossima versione LTS è prevista per settembre 2021. Ricordiamo che a partire dal rilascio di Java 10, il progetto è passato a un nuovo processo di sviluppo, implicando un ciclo più breve per la formazione di nuove versioni. Le nuove funzionalità sono ora sviluppate in un ramo principale costantemente aggiornato, che include modifiche già pronte e da cui si diramano i rami ogni sei mesi per stabilizzare le nuove versioni.

In preparazione alla nuova versione, lo sviluppo è passato dal sistema di controllo della versione Mercurial a Git e alla piattaforma di sviluppo collaborativo GitHub. Si prevede che la migrazione migliorerà le prestazioni delle operazioni del repository, aumenterà l'efficienza dello storage, fornirà accesso alle modifiche nel corso della cronologia del progetto, migliorerà il supporto per la revisione del codice e consentirà alle API di automatizzare i flussi di lavoro. Inoltre, l'uso di Git e GitHub rende il progetto più attraente per i principianti e gli sviluppatori abituati a Git.

Le nuove funzionalità di Java 16 includono:

  • Aggiunto il modulo sperimentale jdk.incubator.vector con un'implementazione della Vector API, che fornisce funzioni per i calcoli vettoriali eseguiti utilizzando istruzioni vettoriali sui processori x86_64 e AArch64 e consente di applicare operazioni contemporaneamente a più valori (SIMD). A differenza delle funzionalità fornite nel compilatore JIT HotSpot per la vettorizzazione automatica delle operazioni scalari, la nuova API consente di controllare esplicitamente la vettorizzazione per l'elaborazione parallela dei dati.
  • Il codice JDK e VM HotSpot scritto in C++ può utilizzare le funzionalità introdotte nella specifica C++14. In precedenza erano consentiti gli standard C++98/03.
  • Lo ZGC (Z Garbage Collector), che opera in modalità passiva e minimizza il più possibile i ritardi dovuti alla garbage collection, ha aggiunto la possibilità di elaborare stack di thread in parallelo senza mettere in pausa i thread dell'applicazione. Lo ZGC ora ha solo lavori che richiedono sospensione, che presentano ritardi costanti, di solito non superiori a poche centinaia di microsecondi.
  • Aggiunto il supporto per i socket Unix (AF_UNIX) alle classi SocketChannel, ServerSocketChannel e java.nio.channels.
  • Per la distribuzione Linux Alpine con la libreria C standard musl è stato implementato un porting, molto diffuso negli ambienti per container, microservizi, cloud e sistemi embedded. La porta proposta in tali ambienti consente di eseguire programmi Java come normali applicazioni. Inoltre, utilizzando jlink, è possibile rimuovere tutti i moduli inutilizzati e creare un ambiente minimo sufficiente per eseguire l'applicazione, che consente di creare immagini compatte specifiche dell'applicazione.
  • È stato implementato il meccanismo Elastic Metaspace, ottimizzando le operazioni di allocazione e restituzione della memoria occupata dai metadati delle classi (metaspace) in JVM HotSpot. L'uso di Elastic Metaspace riduce la frammentazione della memoria, riduce il sovraccarico del caricatore di classi e ha anche un effetto benefico sulle prestazioni delle applicazioni server di lunga esecuzione grazie al ritorno più rapido della memoria occupata dai metadati delle classi inutilizzate al sistema operativo. Per selezionare la modalità di rilascio della memoria dopo aver scaricato le classi, viene offerta l'opzione "-XX:MetaspaceReclaimPolicy=(balanced|aggressive|none)".
  • È stata aggiunta una porta JDK per i sistemi Windows in esecuzione su hardware con processori basati sull'architettura AArch64.
  • È stata proposta una terza anteprima dell'API Foreign-Memory Access, che consente alle applicazioni Java di accedere in modo sicuro ed efficiente alle regioni di memoria esterne all'heap Java manipolando le nuove astrazioni MemorySegment, MemoryAddress e MemoryLayout.
  • È stata implementata un'API sperimentale Foreign Linker, che fornisce l'accesso da Java al codice nativo. Insieme all'API Foreign-Memory, la nuova interfaccia di programmazione rende molto più semplice la creazione di wrapper rispetto alle librerie condivise convenzionali.
  • Aggiunta l'utilità jpackage, che consente di creare pacchetti per applicazioni Java autonome. L'utility è basata su javapackager di JavaFX e consente di creare pacchetti in formati nativi per varie piattaforme (msi ed exe per Windows, pkg e dmg per macOS, deb e rpm per Linux). I pacchetti includono tutte le dipendenze richieste.
  • L'incapsulamento rigoroso di tutti i componenti interni di JDK è abilitato per impostazione predefinita, ad eccezione delle API critiche come sun.misc.Unsafe. Il valore dell'opzione "--illegal-access" è ora impostato su "deny" invece che su "permit" per impostazione predefinita, il che bloccherà i tentativi da parte del codice di accedere alla maggior parte delle classi, dei metodi e dei campi interni. Per aggirare la restrizione, utilizzare l'opzione “-illegal-access=permit”.
  • Stabilizzata l'implementazione del patternmatching nell'operatore “instanceof”, che permette di definire immediatamente una variabile locale a cui fare riferimento al valore controllato. Ad esempio, puoi scrivere immediatamente "if (obj istanza di String s && s.length() > 5) {.. s.contains(..) ..}" senza definire esplicitamente "String s = (String) obj". Era: if (oggetto istanza del Gruppo) { Gruppo gruppo = (Gruppo) oggetto; var voci = group.getEntries(); } Ora puoi fare a meno di definire “Group group = (Group) obj”: if (obj istanza di Group group) { var items = group.getEntries(); }
  • L'implementazione della parola chiave "record" è stata stabilizzata, fornendo una forma compatta per le definizioni di classe che elimina la necessità di definire esplicitamente vari metodi di basso livello come equals(), hashCode() e toString() nei casi in cui vengono archiviati dati solo nei campi con i quali non cambia. Quando una classe utilizza implementazioni standard dei metodi equals(), hashCode() e toString(), può fare a meno della loro definizione esplicita: public record BankTransaction(LocalDate date, double amount, String description) {}

    Questa dichiarazione aggiungerà automaticamente le implementazioni dei metodi equals(), hashCode() e toString() oltre ai metodi costruttore e getter.

  • Viene proposta una seconda bozza per classi e interfacce sigillate che non possono essere utilizzate da altre classi e interfacce per ereditare, estendere o sovrascrivere implementazioni. Le classi sigillate forniscono anche un modo più dichiarativo per limitare l'uso di una superclasse rispetto ai modificatori di accesso, basato sull'elenco esplicito delle sottoclassi consentite per l'estensione. pacchetto com.example.geometry; la classe pubblica sigillata Shape consente com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {…}

Fonte: opennet.ru

Aggiungi un commento