Prestazioni lente su Java 7
Le prestazioni di AEM su Java 7 diminuiscono improvvisamente e i thread dump non mostrano alcuna prova di un thread colpevole; molti thread sono in stato RUNNABLE e eseguono di parti di codici che non hanno difetti.
La causa principale di questo problema è che Java 7 soffre del problema CodeCache descritto in questa domanda e risposta di Stack Overflow.
In sintesi, "In Java 7, una volta che la CodeCache è piena, la JIT viene interrotta, poi si esegue un flush di quasi un terzo dell'area CodeCache ma la JIT non viene in seguito riabilitata."
Questo scenario comporta un'esecuzione molto più lenta del codice Java che è stato espulso dalla cache del codice o che non è mai stato eseguito da JVM. Pertanto, alcune richieste che colpiscono solo il codice compilato dalla JIT risponderanno ancora con i soliti tempi di risposta, mentre altre richieste richiederanno molto più tempo.
Soluzione: Aggiorna la versione Java o disabilita il flush della cache del codice
Ci sono tre possibili soluzioni:
- Aggiornamento a Java 8, che non è influenzato da questo problema di prestazioni. Questa è la soluzione più sicura.
- Aggiornamento a Java 1.7.0_101-b14, che richiede il supporto Java SE di Oracle, in quanto Java 7 è EOL da maggio 2015
- Disabilita il flush della cache del codice e aumenta la dimensione della cache aggiungendo i seguenti argomenti JVM nello script di avvio di AEM:
- -XX:-UseCodeCacheFlushing
- -XX:ReservedCodeCacheSize=90M
Questi argomenti specificano una dimensione della cache del codice di 90 MB (invece dei 48 MB predefiniti) e disabilitano il flushing della cache del codice, in tal modo, in caso di overflow della cache, l'hot code esistente non viene eseguito in modalità interprete (solo il nuovo codice non viene più compilato). Monitora la dimensione della cache del codice per un certo tempo (per esempio usando jconsole) per assicurarti che il valore massimo configurato non sia troppo basso. Nota che dopo l'aggiornamento a Java 8, è necessario rimuovere queste impostazioni.