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
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? –
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. –
In mancanza di profilazione dell'applicazione con JProdilfer/Yourkit, non avrete alcun suggerimento valido. –