Java 27 è uscito il 15 settembre 2026 e porta 9 JEP: crittografia post-quantistica in TLS 1.3, G1 come garbage collector predefinito ovunque, Compact Object Headers attivi di default e nuove anteprime su pattern matching, costanti lazy e concorrenza strutturata. È una release semestrale, non LTS.
La domanda pratica, però, è un'altra: ti conviene aggiornare? In questa guida trovi le novità di Java 27 spiegate una per una, con esempi di codice, cosa cambia davvero in produzione (soprattutto nei container) e come decidere se passare a Java 27 o restare su Java 25 LTS.
Java 27 in breve: le 9 JEP
Prima di entrare nel dettaglio, ecco il quadro completo. Le JEP si dividono in tre gruppi: cambiamenti definitivi, anteprime (preview) e API in incubazione.
- JEP 527: scambio di chiavi ibrido post-quantistico per TLS 1.3 (definitivo).
- JEP 523: G1 diventa il garbage collector predefinito in tutti gli ambienti (definitivo).
- JEP 534: Compact Object Headers attivi per impostazione predefinita (definitivo).
- JEP 536: redazione dei dati sensibili in Java Flight Recorder (definitivo).
- JEP 538: codifica PEM degli oggetti crittografici (terza preview).
- JEP 533: Structured Concurrency (settima preview).
- JEP 532: tipi primitivi in pattern,
instanceofeswitch(quinta preview). - JEP 531: Lazy Constants (terza preview).
- JEP 537: Vector API (dodicesima incubazione).
Insieme a Java 27 sono usciti anche JavaFX 27 e Helidon 27, che da questa versione allinea numerazione e cadenza dei rilasci a quelle di OpenJDK.
Sicurezza: TLS 1.3 diventa pronto per il post-quantum
La novità più importante di Java 27 per chi gestisce applicazioni in produzione è la JEP 527. Introduce lo scambio di chiavi ibrido in TLS 1.3: un algoritmo classico e ML-KEM, l'algoritmo post-quantistico standardizzato dal NIST, lavorano insieme per generare il segreto condiviso della sessione.
Perché ibrido? Perché per rompere la connessione un attaccante dovrebbe superare entrambi i meccanismi. Se un giorno si scoprisse una debolezza in ML-KEM, resta la protezione classica. Se un computer quantistico rendesse vulnerabile l'algoritmo classico, resta quella post-quantistica.
Il rischio che risolve si chiama harvest now, decrypt later: qualcuno intercetta oggi traffico cifrato e lo conserva per decifrarlo quando avrà a disposizione un computer quantistico. Se la tua applicazione trasmette dati che devono restare riservati per anni (dati finanziari, sanitari, contratti), questa JEP ti riguarda già adesso.
Sempre sul fronte crittografia, la JEP 538 arriva alla terza preview con API standard per leggere e scrivere chiavi e certificati in formato PEM, senza librerie esterne.
Java Flight Recorder oscura i dati sensibili
La JEP 536 permette di oscurare le informazioni sensibili prima che finiscano nelle registrazioni di Java Flight Recorder. È un dettaglio che conta: le registrazioni diagnostiche spesso vengono passate al supporto o caricate in sistemi di osservabilità, e possono contenere nomi, identificativi o stringhe con dati personali. Con la redazione nel processo tieni le metriche utili e tagli fuori quello che non deve uscire, un aiuto concreto anche per la conformità al GDPR.
Prestazioni: G1 ovunque e oggetti più leggeri
Due JEP cambiano il comportamento predefinito della JVM. Sono quelle a cui fare più attenzione quando aggiorni, perché non devi abilitare niente: cambiano da sole.
G1 diventa il garbage collector predefinito ovunque (JEP 523)
Fino a Java 26, su macchine con poche risorse la JVM poteva scegliere in automatico un garbage collector diverso da G1, tipicamente Serial. Con Java 27 G1 è il predefinito in tutti gli ambienti, per rendere il comportamento uguale tra sviluppo, container e produzione.
Dove si nota? Nei container Docker con limiti bassi di CPU e memoria, proprio quelli dove prima veniva scelto Serial. Se hai microservizi piccoli e dopo l'aggiornamento vedi un consumo di memoria o una latenza diversi, questo è il primo punto da controllare. Per tornare al comportamento precedente basta un flag esplicito:
java -XX:+UseSerialGC -jar app.jar
Compact Object Headers attivi di default (JEP 534)
Ogni oggetto Java ha un'intestazione (header) nell'heap. Con i Compact Object Headers questa intestazione occupa meno spazio. Sul singolo oggetto il risparmio è piccolo, ma su applicazioni con milioni di oggetti in memoria si traduce in un heap più leggero e meno lavoro per il garbage collector. In pratica: più applicazioni sullo stesso server, a parità di risorse.
Se incontri problemi con librerie che fanno assunzioni sulla struttura degli oggetti in memoria, puoi disattivarli con -XX:-UseCompactObjectHeaders.
Vector API, dodicesima incubazione (JEP 537)
La Vector API permette di scrivere calcoli che la JVM traduce in istruzioni SIMD della CPU, cioè la stessa operazione su più valori in un colpo solo. Serve per calcolo numerico, analisi dati, multimedia e machine learning. Resta in incubazione perché deve funzionare bene su architetture molto diverse senza perdere la portabilità di Java.
Linguaggio: le anteprime con esempi di codice
Le funzioni in preview vanno abilitate esplicitamente. Per provarle al volo su un singolo file:
java --enable-preview --source 27 Main.java
Per compilare un progetto usa javac --release 27 --enable-preview. Ricorda che le preview possono cambiare nelle versioni successive: vanno bene per sperimentare, non per il codice di produzione.
Tipi primitivi nei pattern (JEP 532)
Il pattern matching ora tratta i tipi primitivi come gli oggetti. Puoi usare instanceof per verificare se un valore sta in un tipo più piccolo senza perdere informazione:
long valore = 42L;
if (valore instanceof int i) {
System.out.println("Sta in un int: " + i);
}
String classe = switch (voto) {
case int v when v >= 90 -> "ottimo";
case int v when v >= 60 -> "sufficiente";
case int v -> "insufficiente";
};
Meno cast manuali, meno controlli di intervallo scritti a mano e meno errori silenziosi di troncamento.
Lazy Constants (JEP 531)
Le costanti lazy vengono calcolate solo al primo utilizzo e poi restano immutabili, con le stesse ottimizzazioni di una costante vera. Utile per oggetti costosi da creare che non servono in ogni esecuzione, come un client HTTP o una configurazione pesante:
private static final LazyConstant<Config> CONFIG =
LazyConstant.of(() -> Config.caricaDaFile("app.yaml"));
// la configurazione viene letta solo qui, alla prima chiamata
Config c = CONFIG.get();
Il vantaggio concreto è un avvio più rapido dell'applicazione, senza rinunciare alla sicurezza di un valore che non cambia più.
Structured Concurrency (JEP 533)
La concorrenza strutturata tratta un gruppo di task paralleli come un'unica unità di lavoro: se uno fallisce, gli altri vengono cancellati e l'errore risale in modo pulito. Si sposa con i virtual thread, stabili da Java 21:
try (var scope = StructuredTaskScope.open()) {
var utente = scope.fork(() -> caricaUtente(id));
var ordini = scope.fork(() -> caricaOrdini(id));
scope.join();
return new Profilo(utente.get(), ordini.get());
}
È il modello ideale per un backend che deve chiamare in parallelo database, API esterne o servizi AI e combinare i risultati. Essendo alla settima preview, i dettagli dell'API possono ancora cambiare prima della versione definitiva.
Java 27 è LTS? Conviene aggiornare?
No, Java 27 non è una versione LTS. L'ultima LTS è Java 25, uscita a settembre 2025. La prossima prevista è Java 29, a settembre 2027. Java 26 e Java 27 sono release intermedie, con supporto breve: vengono superate dalla versione successiva dopo sei mesi.
La mia regola pratica per decidere:
- Applicazioni in produzione per clienti o gestionali aziendali: resta su Java 25 LTS. Stabilità e aggiornamenti di sicurezza a lungo termine valgono più delle novità.
- Servizi nuovi, microservizi interni, progetti personali: Java 27 ha senso, soprattutto per G1 uniforme e Compact Object Headers, se sei pronto ad aggiornare di nuovo tra sei mesi.
- Dati che devono restare riservati per anni: tieni d'occhio la JEP 527. Il supporto post-quantistico è previsto anche sulle versioni LTS, quindi puoi pianificare la migrazione senza correre.
- Sviluppo e test: usa Java 27 per provare le preview e preparare il codice alla prossima LTS.
Come installare Java 27 e verificare la versione
Java 27 si scarica come build OpenJDK dal sito ufficiale del progetto e dalle principali distribuzioni OpenJDK, oltre che come JDK di Oracle. Se usi un gestore di versioni come SDKMAN su Linux o macOS, l'installazione è di un solo comando appena la versione è disponibile nel catalogo. Dopo l'installazione, verifica con:
java -version
Prima di aggiornare un progetto esistente, fai questi controlli: compatibilità delle dipendenze (framework, driver, agent di monitoraggio), versione degli strumenti di build, immagini Docker di base e, come visto sopra, il comportamento del garbage collector nei container piccoli. Un agente AI di coding può aiutarti a trovare i punti da cambiare in un progetto grande; ne parlo nel confronto tra Devin, Claude Code, Codex e Cursor, ma la revisione finale resta tua.
Cosa arriva dopo: Valhalla e Leyden
Insieme a Java 27 sono disponibili le build early access di JDK 28, dove parte una fase importante di Project Valhalla. L'obiettivo è introdurre value class e value object: dati compatti come i tipi primitivi, ma con il modello a oggetti di Java. Per chi gestisce grandi collezioni di piccoli oggetti, come in analytics, finanza o machine learning, è il cambiamento più atteso da anni. Non è ancora pronto per la produzione.
In parallelo prosegue Project Leyden, che punta a ridurre tempi di avvio e warm-up della JVM con la compilazione anticipata (AOT). Valhalla lavora su come Java rappresenta i dati, Leyden su quanto ci mette a partire: sono le due direzioni da seguire per capire dove andrà la piattaforma.
Leggi anche
- Devin vs Claude Code, Codex e Cursor: quale agente scegliere
- Copilot CLI vs Claude Code: prezzi, limiti e quale scegliere
- OpenAI Agents API: cos'è, quanto costa e quando usarla
Conclusione
Le novità di Java 27 non rivoluzionano il linguaggio, ma toccano punti concreti: sicurezza post-quantistica in TLS, memoria più efficiente e un garbage collector uguale ovunque. Per la produzione il consiglio resta Java 25 LTS in attesa di Java 29, mentre Java 27 è il posto giusto per sperimentare e preparare il codice.
Se hai un backend Java, un gestionale o una web app da aggiornare o da far dialogare con servizi AI e vuoi capire da dove partire, scrivimi dalla pagina contatti: rispondo io.



