Tecnologia

Java 27 elimina il GC che bloccava le app e riduce la memoria degli oggetti del 33%

Adrian Kessler
Aggiungici su Google

Java 27 introduce due modifiche che raggiungeranno silenziosamente ogni JVM in esecuzione ovunque. Il garbage collector G1 è ora il default su ogni runtime Java, ponendo fine al persistente utilizzo del collector Serial stop-the-world su hardware limitato, e gli header degli oggetti sono scesi da 96 a 64 bit, riducendo l’overhead di un terzo per qualsiasi applicazione che crei un numero significativo di oggetti.

Il collector Serial era il GC più antico di Java: semplice, prevedibile e brutale. Quando entrava in azione, bloccava l’intera applicazione fino al completamento della pulizia dell’heap. Su server con molta memoria e più CPU, quel compromesso è diventato insostenibile anni fa: G1 ha sostituito Serial come default per i server a partire da Java 9. Gli ambienti limitati hanno continuato a eseguire Serial fino a Java 26: macchine con una sola CPU, piccole VM cloud, sistemi embedded con poca memoria. Quel default termina con Java 27.

G1 divide l’heap in piccole regioni e le raccoglie in modo incrementale, dando priorità alle sezioni con più spazzatura, da qui il nome Garbage-First. Le pause esistono ancora, ma sono più brevi e più prevedibili di una raccolta completa di Serial. Oracle afferma che G1 ora è competitivo con Serial per tutte le dimensioni dell’heap. Per gli sviluppatori che distribuiscono applicazioni sulle istanze cloud più economiche disponibili (una CPU, un gigabyte di RAM), Java 27 elimina un attrito con cui convivevano da anni.

La modifica degli header degli oggetti compatti è l’altra metà di questo rilascio. Gli oggetti Java portano metadati (informazioni sul tipo, codici hash, stato di blocco) memorizzati in un header allegato a ogni oggetto. Il vecchio formato usava 96 bit. Java 27 lo comprime a 64 bit, una riduzione del 33% per oggetto. Per le applicazioni che creano milioni di oggetti (code di messaggi, registri finanziari, microservizi guidati da eventi), l’effetto cumulativo è misurabile: heap più denso, migliore utilizzo della cache della CPU, meno cicli di raccolta necessari.

Entrambe le modifiche presentano avvertenze. Le applicazioni ottimizzate esplicitamente per il comportamento di Serial GC potrebbero notare differenze di temporizzazione inaspettate dopo l’aggiornamento. G1 usa più memoria per la contabilità rispetto a Serial, il che conta in ambienti con budget di memoria davvero limitati, anche se i test Oracle indicano che il compromesso sul throughput è trascurabile per la maggior parte dei carichi di lavoro. I team di sviluppo che distribuiscono Java 27 su sistemi limitati dovrebbero testare i nuovi default prima del rilascio. La transizione è automatica, ma non è invisibile.

Java 27 aggiunge anche lo scambio di chiavi ibrido post-quantistico per TLS 1.3, implementando l’algoritmo ML-KEM insieme al tradizionale scambio di chiavi a curva ellittica X25519. Le connessioni TLS negoziate oggi potrebbero, in teoria, essere catturate e decifrate in seguito da un futuro computer quantistico. Lo scambio di chiavi ibrido difende da questo richiedendo a un attaccante di rompere contemporaneamente un algoritmo classico e uno post-quantistico: un’aggiunta significativa per qualsiasi servizio Java che gestisca dati sensibili.

Java 27 è stato rilasciato il 15 settembre 2026, seguendo la cadenza semestrale della piattaforma. La concorrenza strutturata e le costanti lazy continuano come funzionalità di anteprima in questa versione. Il prossimo rilascio di supporto a lungo termine nella serie Java è previsto per il 2027.

Tag: , , , , ,

Aggiungici su Google

Discussione

Ci sono 0 commenti.