Flag comuni per l'ottimizzazione della JVM
Opzioni per heap, GC e JIT
Flag comuni per l'ottimizzazione della JVM è una lezione Java Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Java Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Java Academy include 4 lezioni in totale.
Perché ottimizzare la JVM?
La JVM dispone di impostazioni predefinite sensate, ma per i servizi più esigenti a volte è necessario regolare la dimensione dell'heap, il garbage collector e il comportamento del JIT.
L'ottimizzazione è l'ultimo passaggio: esegua prima il profiling, corregga il codice, poi ricorra ai flag solo quando le misurazioni lo giustificano.
Dimensione dell'heap: -Xms e -Xmx
I due flag più comuni impostano i limiti dell'heap:
-Xms— dimensione iniziale dell'heap.-Xmx— dimensione massima dell'heap.
Esempio: java -Xms512m -Xmx2g MyApp. Impostare -Xms uguale a -Xmx evita le pause dovute al ridimensionamento nei server a esecuzione prolungata.
Leggere i valori predefiniti
È possibile chiedere alla JVM quali valori ha scelto. Runtime espone i valori attuali dell'heap, mentre -XX:+PrintFlagsFinal stampa il valore effettivo di ogni flag.
L'esempio stampa i limiti di memoria della JVM in esecuzione.
public class Main {
public static void main(String[] args) {
Runtime rt = Runtime.getRuntime();
long mb = 1024 * 1024;
System.out.println("Max heap (Xmx): " + (rt.maxMemory() / mb) + " MB");
System.out.println("Total heap now: " + (rt.totalMemory() / mb) + " MB");
System.out.println("Free in heap: " + (rt.freeMemory() / mb) + " MB");
System.out.println("Available cores: " + rt.availableProcessors());
}
}Scegliere un collector
I JDK moderni offrono diversi garbage collector:
-XX:+UseG1GC— il predefinito; bilanciato e basato su regioni.-XX:+UseZGC— pause ultra-brevi, heap di grandi dimensioni.-XX:+UseParallelGC— throughput massimo, pause più lunghe.-XX:+UseSerialGC— a thread singolo, per app e container di piccole dimensioni.
Obiettivo di pausa di G1
G1 è un collector orientato al tempo di pausa. Gli si assegna un obiettivo e cerca di rispettarlo:
-XX:MaxGCPauseMillis=200chiede a G1 di mantenere le pause intorno ai 200 ms.
Si tratta di un obiettivo flessibile, non di una garanzia. Impostarlo su un valore troppo basso forza raccolte frequenti e brevi e può danneggiare il throughput.
ZGC per una bassa latenza
Quando le pause devono rimanere inferiori al millisecondo anche con heap di diversi gigabyte, utilizzi ZGC con -XX:+UseZGC.
Esegue la maggior parte del lavoro in parallelo con i thread dell'applicazione. Il compromesso è un overhead aggiuntivo di CPU e memoria rispetto a G1. È ideale per i servizi sensibili alla latenza.
Logging del GC
Per ottimizzare il GC è necessario osservarlo. Abiliti il logging unificato:
-Xlog:gc*:file=gc.log:time,uptime,level,tags
Questa opzione registra ogni raccolta con timestamp e durata. Passi il log a un visualizzatore, oppure a JMC/JFR, per individuare pause lunghe o frequenti prima di modificare qualsiasi flag.
Container e CPU
All'interno dei container, la JVM legge i limiti dei cgroup. Per impostazione predefinita, utilizza per l'heap una frazione del limite di memoria.
-XX:MaxRAMPercentage=75.0imposta l'heap come percentuale della memoria del container.-XX:ActiveProcessorCount=Nsostituisce il numero di CPU rilevato.
In questo modo si evita di impegnare più memoria di quella che l'orchestratore finirebbe per liberare terminando il processo.
Flag JIT e diagnostici
Alcuni altri flag utili:
-XX:+HeapDumpOnOutOfMemoryError— esegue il dump dell'heap in caso di OOM per l'analisi post-mortem.-XX:HeapDumpPath=/tmp— specifica dove scriverlo.-XX:+PrintCompilation— mostra l'attività di compilazione JIT.
Hanno un costo ridotto e si rivelano preziosi quando qualcosa va storto.
Disciplina nella messa a punto
Regole d'oro per i flag:
- Modifichi un solo flag alla volta e misuri nuovamente le prestazioni rispetto a una baseline.
- Non copi i flag alla cieca dai post dei blog: potrebbero essere pensati per una JVM obsoleta.
- La maggior parte delle applicazioni ha bisogno solo di
-Xmxe, forse, della scelta del garbage collector; i valori predefiniti sono validi.
Metaspace e thread
L'heap non è l'unica regione di memoria:
-XX:MaxMetaspaceSizelimita lo spazio per i metadati delle classi; senza questo limite, una perdita durante il caricamento delle classi può esaurire la memoria nativa.-Xssimposta la dimensione dello stack per thread; la riduca se esegue un numero molto elevato di thread, oppure la aumenti in caso di ricorsione profonda.
Raramente è necessario ottimizzare questi valori, ma sapere che esistono è utile quando il problema riguarda la memoria nativa e non l'heap.
Verifica rapida
Che cosa controllano i flag -Xms e -Xmx?
Riepilogo
I flag da conoscere:
-Xms/-Xmxdefiniscono i limiti dell'heap.- Scelga un garbage collector: G1 (predefinito), ZGC (pause ridotte), Parallel (throughput).
- Imposti
-XX:MaxGCPauseMillisper G1; abiliti-Xlog:gc*per osservare l'attività. - Utilizzi
MaxRAMPercentagenei container eHeapDumpOnOutOfMemoryErrorcome misura di sicurezza. - Modifichi un solo flag alla volta e misuri i risultati.
Domande Frequenti
La lezione «Flag comuni per l'ottimizzazione della JVM» è gratuita?
Sì — il testo completo di «Flag comuni per l'ottimizzazione della JVM» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Java Academy, passa a CoddyKit PRO. Il corso Java Academy include 4 lezioni in totale.
Cosa imparerò in «Flag comuni per l'ottimizzazione della JVM»?
Opzioni per heap, GC e JIT Eserciti Java Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Java Academy?
Non è richiesta alcuna esperienza precedente. Java Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Flag comuni per l'ottimizzazione della JVM»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Java Academy?
Sì. Ogni lezione Java Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Individuare i colli di bottiglia
- Java Flight Recorder
- Analizzare con JDK Mission Control
- Flag comuni per l'ottimizzazione della JVM