Analizzare i problemi di memoria

Scopri come identificare la causa dei problemi di memoria delle applicazioni Java. Puoi generare automaticamente e manualmente un’immagine heap e un istogramma heap per identificarne la causa.

Descrizione description

Ambiente

Experience Manager

Problema/Sintomi

L’applicazione JAVA è più lenta e alla fine esaurisce la memoria oppure viene visualizzato un errore nei registri o nell’output della console OutOfMemoryError: Java heap space o OutOfMemoryError: gc overhead limit exceeded.

Risoluzione resolution

Causa
Tali problemi possono avere molte cause.

Una possibile causa è che l’applicazione Java, nel nostro caso CRX/CQ, è stata avviata dalla riga di comando con le impostazioni predefinite di memoria heap di Java. Questo significa che il parametro jvm -Xmx non è stato specificato. L’esecuzione di CRX o CQ richiede almeno 256 MB di heap assegnati. Se il problema è questo, parti dalla riga di comando e assicurati che le impostazioni della memoria heap siano impostate. Esempio:

java -Xmx512m -jar *.jar

In caso contrario, l’applicazione potrebbe mantenere troppi oggetti senza rilasciarli per la raccolta oggetti inattivi. Questo fenomeno è chiamato perdita di memoria. Per ulteriori informazioni, consulta questa pagina. Consulta la sezione seguente su come analizzare i problemi di memoria nelle applicazioni Java.
Crea immagine heap:

Generare automaticamente un’immagine heap

Per creare automaticamente un’immagine heap quando la memoria è esaurita, puoi aggiungere il parametro jvm -XX:+HeapDumpOnOutOfMemoryError per generare automaticamente un’immagine heap quando l’applicazione genera un errore OutOfMemoryError. Ad esempio,

java -Xmx256m -XX:+HeapDumpOnOutOfMemoryError -jar *.jar

Viene generato un file dell’immagine heap (java_...hprof) nella directory di lavoro del processo ogni volta che il processo java esaurisce la memoria. Il processo può continuare a funzionare anche dopo la generazione dell’immagine heap. Di solito un file dell’immagine heap è sufficiente per analizzare il problema.

Nota:  se utilizzi lo script crx-quickstart/server/start per avviare l’istanza CRX, puoi aggiungere -XX:+HeapDumpOnOutOfMemoryError alla variabile CQ_JVM_OPTS (assicurati che anche la variabile sia priva di commenti). Ad esempio:

CQ_JVM_OPTS='-XX:+HeapDumpOnOutOfMemoryError'

Dopo aver aggiunto questo parametro e riavviato l’istanza CRX, verifica che la nuova opzione jvm sia impostata. Esegui ps -ef | grep java dalla riga di comando. Verifica quindi se vedi -XX:+HeapDumpOnOutOfMemoryError come parametro del processo Java CRX.

Se a causa delle restrizioni di spazio su disco devi specificare una directory diversa per generare l’immagine heap, puoi aggiungere il parametro -XX:HeapDumpPath=/path/to/generate/heapdump in modo da segnalare a jvm la posizione in cui inserire il file.

Consulta qui per un riferimento ai parametri jvm correlati al debug.
Generare manualmente un’immagine heap
JVM Sun/Oracle

Per generare manualmente un’immagine heap, esegui questo comando (jmap e jps si trovano nella cartella bin della home directory jdk):

  1. cerca il pid del processo java per il quale stai generando un’immagine heap.

    • In Unix o Linux questo può essere fatto con ps -ef | grep java o jps -l
    • Per eseguire questa operazione in Windows, aprire Gestione attività, premere Ctrl+Shift+Esc quindi vai a  Visualizza  quindi vai a  Seleziona colonne quindi vai a   PID (Process Identifier)  o jps -l
  2. Esegui il comando jmap seguente, sostituisci /path/to/generate/heapdumpfile.hprof con la posizione in cui desideri generare il file dell’immagine heap e sostituisci 1234 con il pid individuato nel passaggio precedente.

    code language-none
    jmap -dump:format=b,file=/path/to/generate/heapdumpfile.hprof 1234
    

JVM IBM

Per generare le immagini corrette sul segnale utente, devi innanzitutto modificare le impostazioni JVM predefinite relative agli agenti Dump. Esistono diversi tipi di immagini, ma in generale hai bisogno dell’immagine di sistema  completa per eseguire un’analisi approfondita della memoria. Aggiungi i seguenti argomenti:

Xdump:heap:opts=PHD+CLASSIC:events=user -Xdump:system:events=user

Questo evento "utente" si verifica quando JVM riceve il segnale SIGQUIT (Linux, AIX®, z/OS® e i5/OS™) o SIGBREAK (Windows) dal sistema operativo.

Per ulteriori informazioni, consulta la documentazione del fornitore.

Avvertenza:  I file dell’immagine heap sono molto grandi e possono raggiungere le stesse dimensioni su disco della configurazione del parametro jvm heap -Xmx massima. Assicurati di avere abbastanza spazio su disco allocato alla directory in cui viene generato il file di immagine.
Analizzare l’immagine heap
Un buon strumento per analizzare le immagini heap è EclipseMAT (Eclipse Memory Analyzer).

Questo strumento non può analizzare le immagini generate da  JVM IBM. Per eseguire questa operazione, ci sono diverse possibilità. IBM HeapAnalyzer funziona bene per le immagini heap in formato PHD o classico.

Per un'analisi completa dell'immagine di sistema, utilizzate IBM Support Assistant Workbench, con Strumenti di monitoraggio e diagnostica IBM per Java - Memory Analyzer installato nella parte superiore. L’istogramma heap è una semplice misurazione del numero di oggetti attivi e della memoria utilizzata per la classe Java. Sfortunatamente, a seconda dell’installazione Java, gli strumenti richiesti potrebbero non essere disponibili o non funzionare sempre. Per creare un istogramma heap, devi innanzitutto disporre dell’ID processo del processo Java. Per ottenerlo, esegui ps or (if available), run:Istogramma heap
L’istogramma heap è una semplice misurazione del numero di oggetti attivi e della memoria utilizzata per la classe Java. Sfortunatamente, a seconda dell’installazione Java, gli strumenti richiesti potrebbero non essere disponibili o non funzionare sempre. Per creare un istogramma heap, devi innanzitutto disporre dell’ID processo del processo Java. Per ottenerlo esegui ps oppure, se disponibile, il comando seguente:

jps -l

Questo strumento Java ottiene gli ID processo di tutti i processi Java in esecuzione. Esempio:

327
3332 sun.tools.jps.Jps
3313 crx-quickstart-....jar

Adesso esegui il comando seguente:

jmap -histo 3313

L’elenco è ordinato in base alla memoria totale richiesta (superficiale, escludendo gli oggetti di riferimento). Le prime 20 righe dell’output sono le più interessanti. Esempio di output:

JVM version is 1.5.0_20-141
Iterating over heap. This may take a while...
Warning: skipping invalid TLAB for thread t@62211
Warning: skipping invalid TLAB for thread t@62467
...
SizeCountClass description
-------------------------------------------------------
1059290412916byte`[` `]`
1028584075255* ConstMethodKlass
628317658388char`[` `]`
604230414928int`[` `]`
4995752116201* SymbolKlass
422089675255* MethodKlass
41965126969* ConstantPoolKlass
29285606969* InstanceKlassKlass
26310086066* ConstantPoolCacheKlass
2395872149742org.apache.jackrabbit.core.query.lucene.DocId$PlainDocId
14760087003java.util.HashMap$Entry`[` `]`
139612858172java.lang.String
107023244593java.util.HashMap$Entry
75398410036short`[` `]`
73546454org.apache.jackrabbit.core.query.lucene.DocId`[` `]`
7201927502java.lang.Class
64070413348com.day.crx.persistence.tar.index.IndexEntry
...

Informazioni aggiuntive

Per agevolare l’analisi del problema è utile conoscere anche le informazioni seguenti:

  • Versione di CRX o CQ, incluso un elenco di tutti i numeri di versione delle correzioni rapide installate.
  • Sistema operativo, fornitore JVM e versione.

Riferimenti

[ 1] Centro assistenza Oracle > Guida alla risoluzione dei problemi per la VM HotSpot
[ 2]  Oracle.com > java > Opzioni di debug

recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f