2012-06-24 19 views
13

Abbiamo un'applicazione Web che esegue Java 6, Tomcat 6, Spring Framework 3, Hibernate 4, EhCache. Abbiamo un problema con tempi di raccolta dei rifiuti estremamente lunghi che possono richiedere 30 secondi o più, lasciando l'applicazione non risponde.Tempi di raccolta dei rifiuti estremamente lunghi

Attualmente siamo in fase di test, ma a parte l'ovvio: aggiungere più memoria, mi chiedevo se ci sono aspetti che potremmo ottimizzare per ridurre i tempi di raccolta dei dati inutili.

Il principale contributo all'utilizzo della memoria è EHCache dato che la cache è aggressiva. Ma trovo sempre difficile dimensionare gli archivi EHCache (i nuovi archivi di dimensioni byte EhCache, ci portano tutti i tipi di problemi perché i grafici degli oggetti memorizzati nella cache possono essere piuttosto grandi).

Queste sono le mie impostazioni per la JVM

JAVA_OPTS="$JAVA_OPTS -server -Xms256m -Xmx704m XX:OnOutOfMemoryError=/usr/share/scripts/on_server_crash.sh -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/tomcat6 -XX:MaxPermSize=192m -XX:+UseConcMarkSweepGC 
+0

Hai questi tempi lunghi prima che la memoria raggiunga il massimo di 704 MB? La JVM può essere un po '"aggressiva" nel tentativo di ridurre la memoria utilizzata (e eventualmente spostarla) prima di decidere di aumentare la memoria utilizzata. Si comporta allo stesso modo se si avvia -Xms704m -Xmx704m all'avvio? –

+0

Utilizzando "jstat -gc 1s pid" è possibile vedere se l'utilizzo della memoria colpisce gli asili nido o se l'allocazione di memoria tra asili nido, eden e vecchi deve essere modificata. –

+1

In mancanza di profilazione dell'applicazione con JProdilfer/Yourkit, non avrete alcun suggerimento valido. –

risposta

3

Per ridurre i tempi di GC, la cosa migliore che puoi fare è utilizzare off memoria heap. Se è possibile spostare il maggior numero possibile di dati di grandi dimensioni, è possibile ridurre l'intervallo di tempo complessivo del GC fino a 10 milli-secondi, anche con 100 s di memoria off-heap. Credo che Ehcache supporti gli archivi di dati heap, ma se non lo fa o non è possibile utilizzarlo, suggerisco di guardare le alternative che lo fanno.

Dato che hai solo una memoria massima di 700 MB, sembra che tu stia girando su un server con memoria molto limitata. Altrimenti ti suggerirei di iniziare con un massimo di 8 o 16 GB e ridurre le dimensioni della memoria se ritieni di non averne realmente bisogno.

+0

Le dimensioni della memoria non dovrebbero essere un problema nei tempi di GC. Solo il numero di oggetti creati prima dell'inizio di GC. – user2763361

+1

@ user2763361 Il numero di oggetti è molto importante e altri fattori come il numero di riferimenti e la generazione di quei riferimenti, ma è la dimensione che si può vedere negli strumenti di monitoraggio.Se si riduce la memoria consumata, è possibile migliorare le prestazioni poiché questo di solito significa ridurre il numero di oggetti e la quantità di riferimento indiretto. In breve, hai ragione, ma l'utilizzo della memoria è più facile da misurare. –

+0

Ben detto. Correlato: http://stackoverflow.com/questions/21675709/how-to-find-which-objects-are-creating-the-most-garbage – user2763361

1

C'è uno strumento eccellente da parte di FourSquare. Controlla questo link e il rapido esempio che hanno. Foursquare Heap tool.. Sulla base della diagnostica che si trova in uno degli strumenti sopra menzionati, la maggior parte della soluzione ordinata per risolvere il problema sarà quella di aggiungere più RAM o aggiungere potenza al processore della CPU. Se sei aperto ad alcune modifiche dell'infrastruttura, controlla Zing from Azul Systems. Ma penso che la seconda opzione potrebbe essere un tratto.

Problemi correlati