Analysera minnesproblem

Lär dig hur du identifierar orsaken till minnesproblem i Java-program. Du kan generera en heap-dump automatiskt och manuellt, samt ett heap-histogram, för att identifiera orsaken.

Beskrivning description

Miljö

Experience Manager

Problem/symtom

JAVA-programmet körs långsammare och har slut på minne eller så visas ett fel i loggarna eller i konsolutdata OutOfMemoryError: Java heap space eller OutOfMemoryError: gc overhead limit exceeded.

Upplösning resolution

Orsak
Sådana problem kan ha många orsaker.

En möjlig orsak är att Java-programmet, i vårt fall CRX/CQ, startades från kommandoraden med standardinställningarna för heap-minnet för Java. Detta innebär att parametern jvm -Xmx har inte angetts. CRX eller CQ behöver minst 256 MB stackutrymme för körning. Om detta är problemet måste du kontrollera att inställningarna för stackminnet är inställda från kommandoraden. Exempel:

java -Xmx512m -jar *.jar

Om så inte är fallet kan programmet behålla för många objekt utan att frigöra dem för skräpinsamlingen. Detta kallas för en minnesläcka. här för mer information. Se avsnittet nedan om hur du analyserar minnesproblem i Java-program.
Skapa stackdump:

Generera en heap dump automatiskt

Om du vill skapa en heap dump automatiskt när minnet tar slut kan du lägga till jvm-parametern -XX:+HeapDumpOnOutOfMemoryError om du vill generera en stackdump automatiskt när programmet genererar ett OutOfMemoryError. Exempel:

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

Detta genererar en stackdumpfil (java_...hprof) i processens arbetskatalog när Java-processen får slut på minne. Processen kan fortsätta att köras efter att stackdumpen har skapats. Vanligtvis räcker det med en stackdumpfil för att analysera problemet.

Obs!  om du använder crx-quickstart/server/start skript för att starta CRX-instansen kan du lägga till -XX:+HeapDumpOnOutOfMemoryError till CQ_JVM_OPTS (kontrollera att variabeln också är okommenterad). Exempel:

CQ_JVM_OPTS='-XX:+HeapDumpOnOutOfMemoryError'

När du har lagt till den här parametern och startat om CRX-instansen kontrollerar du att det nya jvm-alternativet har angetts. Kör ps -ef | grep java från kommandoraden. Kontrollera sedan om du ser -XX:+HeapDumpOnOutOfMemoryError som en parameter i CRX Java-processen.

Om du behöver ange en annan katalog för att generera heap dump på grund av begränsningar för diskutrymme, kan du lägga till -XX:HeapDumpPath=/path/to/generate/heapdump -parameter som anger var jvm ska skicka filen.

Se här för en referens till felsökningsrelaterade jvm-parametrar.
Generera en heap-dump manuellt
Sun/Oracle JVM

Om du vill generera en heap-dump manuellt kör du det här kommandot (jmap och jps finns i bin mapp i din jdk-arbetskatalog):

  1. leta upp pid för den java-process som du genererar en heap dump för.

    • I Unix eller Linux kan detta göras med ps -ef | grep java eller jps -l
    • I Windows kan du göra detta genom att öppna aktivitetshanteraren, trycka på Ctrl+Shift+Esc sedan gå till  Visa  sedan gå till  Markera kolumner sedan gå till   PID (Process Identifier)  eller jps -l
  2. Kör jmap-kommandot nedan, ersätt /path/to/generate/heapdumpfile.hprof med den plats där du vill generera stackdumpfilen och ersätta 1234 med den bild som du slog upp i föregående steg.

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

IBM JVM

Du måste först ändra standardinställningarna för JVM för Dumpa agenter för att generera korrekta dumpar för användarsignalen. Det finns flera sorters dumpar, men du behöver vanligtvis den fullständiga  systemdump  för att utföra en grundlig minnesanalys. Lägg till följande argument:

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

Den här användarhändelsen inträffar när JVM tar emot SIGQUIT-signalen (Linux, AIX®, z/OS® och i5/OS™) eller SIGBREAK-signalen (Windows) från operativsystemet.

Mer information finns i leverantörens dokumentation här.

Varning:  Heap dump-filer är stora och kan ha upp till samma storlek på disken som din maximala heap -Xmx jvm-parameterkonfiguration. Se till att du har tillräckligt med diskutrymme tilldelat katalogen där dumpfilen genereras.
Analysera heapdump
Ett bra verktyg för att analysera stackdumpar är EclipseMAT (Eclipse Memory Analyzer).

Det här verktyget kan inte analysera  IBM JVM  genererade dumpar. För dem finns det flera möjligheter. IBM HeapAnalyzer fungerar bra för stackdumpar i PHD- eller klassiskt format.

Om du vill göra en fullständig systemdumpanalys använder du IBM Support Assistant Workbench, med IBM övervaknings- och diagnostikverktyg för Java - minnesanalys installeras överst. Histogrammet för heap är ett enkelt mått på antalet live-objekt och det minne som används per Java-klass. Beroende på Java-installationen kan det hända att de nödvändiga verktygen inte är tillgängliga eller att de inte alltid fungerar. Om du vill skapa ett heap-histogram måste du först ha process-ID:t för Java-processen. För att få det, kör ps or (if available), run:Histogram för heap
Histogrammet för heap är ett enkelt mått på antalet live-objekt och det minne som används per Java-klass. Beroende på Java-installationen kan det hända att de nödvändiga verktygen inte är tillgängliga eller att de inte alltid fungerar. Om du vill skapa ett heap-histogram måste du först ha process-ID:t för Java-processen. För att få det, kör ps eller (om tillgängligt), kör:

jps -l

Detta Java-verktyg hämtar process-ID:n för alla Java-processer som körs. Exempel:

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

Kör följande kommando:

jmap -histo 3313

Listan sorteras efter totalt minne som krävs (grund: exklusive refererade objekt). De första 20 raderna i utdata är de mest intressanta. Exempelutdata:

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
...

Ytterligare information

För att analysera problemet behöver vi också veta följande:

  • CRX- eller CQ-version, inklusive en lista över alla installerade versionsnummer för snabbkorrigeringar.
  • Operativsystem, JVM-leverantör och version.

Referenser

[ 1] Oracle Help Center > Felsökningsguide för HotSpot VM
[ 2]  Oracle.com > javas > FelsökningAlternativ

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