Tuning the JBoss Application Server - Jboss In Action Capitolo 14

1.4.5 Tuning the JVM

Le JVM dei diversi produttori sono in costante aggiornamento per aumentare le performance.
Ci sono due modi di avviare la jvm a linea di comando con parametro -client e con -server. Il client per programmi di breve durata e il server per programmi di lunga durata. La differenza sta nella maniera di compilare il bytecode e di amministrare l'heap. La differenza si vede però su test della durata di ore. La versione client può essere usata per lanciare per esempio ant quella server per jboss.
La JRE per windows viene fornita con la sola versione client per la server serve la JDK.
I parametri vanno passati nella var JAVA_OPTS

set JAVA_OPTS=-server %JAVA_OPTS% ...

14.5.1 Understanding the Java heap

Gli oggetti sono allocati dalla jvm nello heap. I dettagli che seguono sono della virtual machine HotSpot Virtual Machine altre virtual machine hanno altri meccanismi di gestione dello heap.
Ricordiamo che un oggetto quando perde il suo riferimento viene poi eliminato dall'operazione di garbage collection.
Come si vede nella figura 14.3 figura l'eden space è la generazione più giovane dove vi stanno tutti gli oggetti creati di recente. Vi è anche uno spazio dove vi stanno oggetti permamenti come l'istanza di java.lang.Class, e uno spazio tenured generation anche conosciuto come old generation.
Vediamo la tabella degli argomenti: tenendo presente che <number> questo numero è un floating point mentre <size> è un floating point che indica i bites può avere come suffisso K,M,G kilo, mega, giga

-Xms<size> Sets the minimum heap size. In production, set the min and max heap sizes to the same value.
-Xmx<size> Sets the maximum heap size.
-XX:NewSize=<size> Sets the minimum young generation size. In production, set the min and max young generation sizes to the same value.
-XX:MaxNewSize=<size> Sets the maximum young generation size.
-XX:NewRatio=<number> Setta la ratio (media??) della dimensione della young generation come un paragone alla tenured generation. Per esempio un valore di 2 di tenured sarà due volte la dimensione della nuova generazione Usa entrambi NewSize/MaxNewSize come argomenti oppure sua NewRatio non usarli entrambi
-XX:SurvivorRatio= <number> Setta la ratio (media?) dello spazio di eden comparato a uno con la dimensione dello spazio di survivor. Per esempio un survivor ratio di 8 indica che lo spazio di eden è 8 volte as large as either surivivor space Varia la dimensione della young generation . A ratio di 8 buono per piccoli young generation , per esempio 10 MB , e 32 per una larger young generation per esempoi di 100MB
-XX:+UseTLAB Fornisce ogni thread nell'applicazione con la propria area di allocazione (Thread Local Allocation Block) nell'eden space. È una opzione booleana + la attiva e - la disattiva . Da benefici su systemi multiprocessore.
-XX:TLABSize=<size> la dimensione di ogni TLAB Bisogna assicurarsi che la young generation è larga abbastanza per mantenere tutti i TLAB per ogni thread dell'applicazione. Andrebbero provati 64k, 128k, e 256.
-XX:MaxTenuringThreshold=<number> indica il numero di minor collecition a cui un oggetto deve sopravvivere prima di essere automaticamente piazzato nella tenured generation. Un valor usuale è 32.
-XX:MaxPermSize=<size> setta la dimensione della permanent generation non settare questo a meno che non si lanci fuori dallo space vedere la sezione 14.5

In produzione settare la dimensione massima e minima dello heap alla stessa dimensione. In develop no perchè così l'avvio è più veloce e al bisogno si ingrandisce. Per la stessa ragione raccomandiamo di settare la dimensione min e max della young generation allo stevvo valore. È raccomandata settare la dimensione della young generation a un terzo o un quarto della dimensione dello heap.
In develop si possono usare valori diversi. Per default gli script settano l'heap dell'AS tra 128 e 512. In develop magari non si vuole dare tutto questo spazio all'AS perchè si usa già un ide pesante. Questo è un esempio di valori.

set JAVA_OPTS=%JAVA_OPTS% -Xms1200m –Xmx1200m –XX:NewSize=400M –XX:MaxNewSize=400M –XX:SurvivorRatio=32 –XX:+UseTLAB –XX:TLABSize=64K

14.5.2 Understanding garbage collection

Ci sono due categori di garbage collection minor e major, la minor pulisce la young generation la major (o full) pulisce entrambe le zone. Quando la young generation viene pulita tutti gli oggetti che sono ancora in uso e quindi sopravvivono alle pulizie sono spostati in uno spazio designato come "to space" . Questi oggetti sono detti vivi e oggetti non più in vita sono detti morti. Dopo la pulizia l'eden space e gli spazi sopravvisuti designati come "from space" sono vuoti. Se lo spazio si riempe durante la pulizia ogni oggetto in eccesso sopravvissuto viene piazzato nella tenured generation. Ogni oggetto che sopravvive diverse volte alla minor collections è piazzato nella tenured generation. Una volta che la collection (pulizia ) viene completata l'eden space e il from space vengono svuotati e la young generation contiene solo gli oggetti in uso.
Anche questa volta il from space e il to space cambiano designazione perchè dopo la collection lo spazio è sempre vuoto.
Prima che la minor collection è performed la JVM guarda alla tenured generation e determina se c'è abbastanza spazio per mantenere ogni oggetto della young generation che overflow nella tenured generation. Se questo non è vero esegue prima una collection sulla tenured generation . Questo processo è conosciuto come full collection. Quando la tenured generation è collected tutti gli spazi occupati da oggetti irragiungibili sono di nuovo resi disponibili. In molti casi la tenured generation viene anche compattata muovendo tutti gli oggetti sopravvissuti alla fine dello spazio delle tenured generation.

UNDERSTANDING THE COLLECTOR TYPES

Ci sono due tipi base di collector seriale e concorrente, che sono messi a confronto nella tabella sottostante. Nella colonna degli argomenti ci sono le opzioni da passare a linea di comando per attivare la specifica collector. Se si vuole che la young generation venga collected usando threads multipli, bisogna settare l'argomento specificato nella colonna della parallel collection. Non usare questa modalità in un sistema con un solo processore; le performance di garbage collectiont non sono buone come quando si usa un singolo threads. (Ragionamento personale: se abbiamo un singolo processore è inutile attivare più threads per fare una collection tanto verrano sempre eseguiti uno alla volta e quindi avremmo solo overhed.) La tenured generation è sempre collected con un singolo thread, non c'è collector multiplo per questa generazione.
A partire dalla versione 5.0 della JVM il parametro di UseParallelGC per la collector di tipo serial viene attivato automaciamente se il sistema contiene almeno due processori e 1 GB di main memory. Di default la JVM usa un thread di collector per ogni processore del computer. Si può cambiare il numero di thread usando l'argomento –XX:ParallelGCThreads=<number> . Non settare questo valore a un numero che sia maggiore di quello dei processori della macchina. Si può spegnere questa caratteristica usando l'argomento –XX:–UseParallelGC in tal caso un singolo thread viene usato per fare il collect della young generation.

Collector type Argument Parallel collection Description
Serial <none, the default> -XX:+UseParallelGC Mette in pausa le applicazioni java finche la collection non è completata. Se l'argomento di parallel collection è settato then this collector is often referred to as the throughput collector.
Concurrent -XX:+UseConcMarkSweepGC -XX:+UseParNewGC Esegue la collection mentre l'applicazione è in run.La collection è eseguita in phases; solo ogni due short phases è richiesta la pausa dell'applicazione.Questo tipo di collection è definita spesso come collector concorrente.

La JVM contiene una varietà di collector con nomi quali Concurrent Mark Sweep (CMS) e Throughput Collector; ognuno di questi collector esegue il task in una certa maniera. Per esempio il parallel collector per il CMS è differente dal parallel collector del Throughput. Per la nostra discussione manterremo un punto di vista di alto livello e considereremo solo le funzionalità basi quali stop-the-world-collection vs. concurrent collection e l'uso di thread multipli vs quello di uno singolo.

Il councurrent collector tenta di ridurre

Salvo diversa indicazione, il contenuto di questa pagina è sotto licenza Creative Commons Attribution-ShareAlike 3.0 License