Java 25: scrivere codice è più semplice, farlo girare è più efficiente
Java 25 è arrivato (16 settembre 2025) e, come previsto, molti vendor lo hanno già battezzato come LTS. In NextWire abbiamo analizzato le novità e la sensazione è netta: non è una release fatta per stupire con rivoluzioni sintattiche, ma per sistemare quello che ancora risulta rallentare nel flusso di lavoro quotidiano e ottimizzare la resa in produzione. L'idea di fondo sembra essere quella di pulire il campo dai piccoli fastidi storici di Java, mantenendo però un confine molto marcato tra ciò che è pronto per il mondo reale e ciò che richiede ancora un giro di prova in preview.
Come lo stiamo approcciando
Per capire se vale la pena aggiornare subito, lo stiamo guardando attraverso cinque lenti:
- Velocità di prototipazione: quanto è diventato più facile passare dall'idea al codice.
- Resa operativa: l'impatto reale su piccoli progetti e gestione memoria.
- Stabilità delle feature: il peso specifico delle funzionalità final.
- Sforzo di migrazione: quanto tempo bisogna investire per allineare build e configurazioni.
- Continuità: se la direzione presa è coerente con gli ultimi anni.
Meno preparazione per far girare il codice
Le novità su compact source files, il main() di istanza e l'evoluzione di java.lang.IO non servono a creare un "Java semplificato". Servono a permetterci di scrivere un file, lanciarlo e vedere il risultato senza dover per forza mettere in piedi l'intera impalcatura di una classe formale.
Anche import module va in questa direzione: è un dettaglio, certo, ma toglie quel rumore di fondo fatto di decine di import standard che rendono i file meno leggibili.
In breve: Se devi scrivere un micro-tool, uno script di supporto o un prototipo rapido, Java 25 è molto più agile dei suoi predecessori.
Concorrenza: Scoped Values al centro della scena
Il lavoro sul Project Loom prosegue, ma con velocità diverse. La notizia vera qui è la stabilità degli Scoped Values.
Chi lavora con i Virtual Threads sa quanto possa essere pesante o rischioso usare ThreadLocal per gestire il contesto. Gli Scoped Values offrono una soluzione più pulita e sicura per passare dati lungo il ciclo di vita di un task. Al contrario, la Structured Concurrency resta ancora in preview: un segnale che, per quanto promettente, la gestione dei task paralleli non è ancora pronta per essere scolpita nella pietra.
Il vantaggio pratico: Gestire logging, tracing e correlazioni in sistemi ad alta concorrenza oggi è decisamente più lineare.
Startup e warmup: segnali forti per la produzione
In ambito cloud-native e microservizi, il tempo che un servizio impiega per "entrare a regime" è un costo. Java 25 affronta il problema lavorando su AOT cache (Ahead-Of-Time) e sul profiling per l'ottimizzazione dell'avvio. L'obiettivo non è stravolgere il paradigma, ma fare in modo che la JVM raggiunga le massime prestazioni più velocemente, riducendo quella finestra di tempo in cui il servizio è attivo ma non ancora ottimizzato. Non è un beneficio che si ottiene "gratis" per ogni setup, ma con il giusto tuning i risultati sono tangibili.
Efficienza silenziosa: memoria e GC
Sotto il cofano troviamo i Compact Object Headers e il Generational Shenandoah. Sono cambiamenti che lo sviluppatore non vede scrivendo codice, ma che l'SRE nota osservando i grafici di monitoraggio.
- Compact Headers: riducono l'overhead di memoria per ogni singolo oggetto. Su applicazioni che gestiscono milioni di istanze, il risparmio non è trascurabile.
- Generational Shenandoah: punta a rendere la garbage collection ancora più trasparente e meno invasiva su carichi di lavoro importanti.
Una sintesi per punti
| Feature | Stato | Perché ci interessa |
|---|---|---|
| Instance Main & IO | Final | Meno boilerplate per test e piccoli tool. |
| Scoped Values | Final | Gestione del contesto sicura per Virtual Threads. |
| AOT Cache | Migliorata | Startup più rapidi e prevedibili. |
| Compact Headers | Sperimentale | Riduzione del footprint di memoria. |