Geheugenproblemen analyseren

Leer hoe u de oorzaak van geheugenproblemen met Java-toepassingen kunt achterhalen. U kunt automatisch en handmatig een heapdump en een heaphistogram genereren om de oorzaak te achterhalen.

Beschrijving description

Omgeving

Experience Manager

Probleem/symptomen

De toepassing JAVA loopt langzamer en loopt uiteindelijk uit geheugen of u ziet een fout in de logboeken of in de consoleoutput OutOfMemoryError: Java heap space of OutOfMemoryError: gc overhead limit exceeded.

Resolutie resolution

Oorzaak
Dergelijke problemen kunnen vele oorzaken hebben.

Een mogelijke oorzaak is dat de Java-toepassing, in ons geval, CRX/CQ is gestart vanaf de opdrachtregel met de standaardinstellingen voor heapgeheugen van Java. Dit betekent dat de parameter jvm -Xmx is niet opgegeven. CRX of CQ hebben minstens 256 MB heap nodig die is toegewezen om te worden uitgevoerd. Als dit het probleem is, dan begin van de bevellijn, zorg ervoor dat de montages van het heapgeheugen worden geplaatst. Voorbeeld:

java -Xmx512m -jar *.jar

Als dit niet het geval is, dan zou uw toepassing teveel voorwerpen kunnen behouden zonder hen voor de Inzameling van het Afval vrij te geven. Dit wordt een geheugenlek genoemd, zie hier voor meer informatie . Zie de onderstaande sectie over het analyseren van geheugenproblemen in Java-toepassingen.
Hapdump maken:

Automatisch een heapdump genereren

Als u automatisch een heapdump wilt maken wanneer er onvoldoende geheugen beschikbaar is, kunt u de parameter jvm toevoegen -XX:+HeapDumpOnOutOfMemoryError om automatisch een heapdump te genereren wanneer de toepassing een OutOfMemoryError genereert. Bijvoorbeeld:

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

Hiermee wordt een heap-dump-bestand gegenereerd (java_...hprof) in de werkmap van het proces wanneer er onvoldoende geheugen beschikbaar is voor het Java-proces. Het proces kan blijven lopen nadat de heapstortplaats werd geproduceerd. Gewoonlijk is één heap-dump-bestand voldoende om het probleem te analyseren.

Opmerking:  als u crx-quickstart/server/start script om uw CRX-instantie te starten, kunt u toevoegen -XX:+HeapDumpOnOutOfMemoryError aan de CQ_JVM_OPTS variabele (zorg ervoor dat de variabele ook geen commentaren is). Bijvoorbeeld:

CQ_JVM_OPTS='-XX:+HeapDumpOnOutOfMemoryError'

Nadat u deze parameter hebt toegevoegd en de CRX-instantie opnieuw hebt gestart, controleert u of de nieuwe jvm-optie is ingesteld. Uitvoeren ps -ef | grep java vanaf de opdrachtregel. Controleer vervolgens of u ziet -XX:+HeapDumpOnOutOfMemoryError als een parameter van het CRX Java-proces.

Als u een andere map moet opgeven om de heapdump te genereren vanwege beperkingen van de schijfruimte, kunt u de map -XX:HeapDumpPath=/path/to/generate/heapdump parameter voor het opgeven van de locatie van het bestand.

Zie hier voor een referentie van foutopsporingsgerelateerde JVM-parameters.
Handmatig een heapdump genereren
Sun/Oracle JVM

Om een heapstortplaats manueel te produceren, stel dit bevel in werking (jmap en jps kunnen in bin map van de hoofdmap van uw werkmap):

  1. kijk omhoog de pid van het proces java u een stortplaats van de heap voor produceert.

    • In Unix of Linux kan dit worden uitgevoerd met ps -ef | grep java of jps -l
    • In Windows kan dit worden gedaan door de taakmanager te openen, druk Ctrl+Shift+Esc ga vervolgens naar  Weergave  ga vervolgens naar  Kolommen selecteren ga vervolgens naar   PID (Process Identifier)  of jps -l
  2. Voer hieronder de jmap-opdracht uit, vervang /path/to/generate/heapdumpfile.hprof met de locatie waar u het heap-dump-bestand wilt genereren en vervangen 1234 met de pod die u in de vorige stap hebt opgezocht.

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

IBM JVM

U zult eerst de standaardJVM montages betreffende de agenten van de Stortel moeten veranderen, om de correcte dumps op gebruikerssignaal te produceren. Er zijn verschillende soorten dumps, maar over het algemeen heb je de volledige  systeemstortplaats  een grondige geheugenanalyse uit te voeren. Voeg de volgende argumenten toe:

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

Deze "gebruiker"-gebeurtenis vindt plaats wanneer de JVM het SIGQUIT-signaal (Linux, AIX®, z/OS® en i5/OS™) of SIGBREAK (Windows) van het besturingssysteem ontvangt.

Raadpleeg de documentatie van de leverancier voor meer informatie hier.

Waarschuwing:  De stortplaatsdossiers van de heap zijn groot en kunnen tot de zelfde grootte op schijf zijn zoals uw maximum heap - Xmx jvm parameterconfiguratie. Zorg ervoor dat u genoeg schijfruimte hebt die aan de folder wordt toegewezen waar het stortplaatsdossier wordt geproduceerd.
heapdump analyseren
Een goed hulpmiddel om heapdumps te analyseren is EclipseMAT (Eclipse Memory Analyzer).

Dit gereedschap kan niet worden geanalyseerd  IBM JVM  gegenereerde dumpen. Daarvoor zijn er verschillende mogelijkheden. IBM HeapAnalyzer Dit is een goede oplossing voor heapdumps in de indeling PHD of klassiek.

Voor een volledige analyse van de systeemstortplaats, gebruik IBM Support Assistant Workbench, met IBM Monitoring and Diagnostic Tools for Java - Memory Analyzer bovenaan geïnstalleerd. Het heaphistogram is een eenvoudige meting van het aantal actieve objecten en het geheugen dat per Java-klasse wordt gebruikt. Helaas zijn de vereiste gereedschappen, afhankelijk van de Java-installatie, mogelijk niet beschikbaar of werken ze niet altijd. Als u een heaphistogram wilt maken, hebt u eerst de proces-id van het Java-proces nodig. Als u het wilt ophalen, voert u ps or (if available), run:Histogram heap
Het heaphistogram is een eenvoudige meting van het aantal actieve objecten en het geheugen dat per Java-klasse wordt gebruikt. Helaas zijn de vereiste gereedschappen, afhankelijk van de Java-installatie, mogelijk niet beschikbaar of werken ze niet altijd. Als u een heaphistogram wilt maken, hebt u eerst de proces-id van het Java-proces nodig. Als u het wilt ophalen, voert u ps of (indien beschikbaar), uitvoeren:

jps -l

Met dit Java-hulpprogramma worden de proces-id's opgehaald van alle Java-processen die worden uitgevoerd. Voorbeeld:

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

Voer nu de volgende opdracht uit:

jmap -histo 3313

De lijst wordt gesorteerd op het totale vereiste geheugen (oppervlakkig: exclusief objecten waarnaar wordt verwezen). De eerste 20 regels van de uitvoer zijn het interessantst. Voorbeeld-uitvoer:

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

Aanvullende informatie

Om het probleem te helpen analyseren, moeten we ook de volgende informatie hebben:

  • CRX- of CQ-versie, inclusief een lijst met alle geïnstalleerde hotfixes-versienummer.
  • Besturingssysteem, JVM-leverancier en versie.

Verwijzingen

[ 1] Oracle Help Center > Handleiding voor probleemoplossing voor HotSpot VM
[ 2]  Oracle.com > javas > FoutopsporingOpties

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