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:
Genera automaticamente un'immagine heap
Per creare automaticamente un'immagine heap quando la memoria è esaurita, è possibile 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
Questo genera 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 -XX:+HeapDumpOnOutOfMemoryError
è visualizzato come parametro del processo Java di 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
Sun/Oracle JVM
Per generare manualmente un’immagine heap, esegui questo comando (jmap e jps si trovano nella cartella bin
della home directory jdk):
-
cerca il pid del processo java per il quale stai generando un’immagine heap.
- In Unix o Linux è possibile eseguire questa operazione con
ps -ef | grep java
ojps -l
- Per eseguire questa operazione in Windows, apri Gestione attività, premi
Ctrl+Shift+Esc
, vai a Visualizza, quindi vai a Seleziona colonne e poi vai a PID (Process Identifier) ojps -l
- In Unix o Linux è possibile eseguire questa operazione con
-
Esegui il comando jmap seguente, sostituisci
/path/to/generate/heapdumpfile.hprof
con la posizione in cui desideri generare il file dell’immagine heap e sostituisci1234
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.
Avviso: i file dell'immagine heap sono di grandi dimensioni e possono raggiungere le stesse dimensioni su disco della configurazione del parametro jvm heap -Xmx max. Assicurati di avere abbastanza spazio su disco allocato alla directory in cui viene generato il file di immagine.
Analizza 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, utilizzare IBM Support Assistant Workbench con IBM Monitoring and Diagnostic Tools for Java - Memory Analyzer installato. 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]
Guida alla risoluzione dei problemi del Centro assistenza Oracle >
per la macchina virtuale HotSpot[
2]
Oracle.com >
Java >
DebuggingOptions