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):
-
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
ofjps -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) ofjps -l
- In Unix of Linux kan dit worden uitgevoerd met
-
Voer hieronder de jmap-opdracht uit, vervang
/path/to/generate/heapdumpfile.hprof
met de locatie waar u het heap-dump-bestand wilt genereren en vervangen1234
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