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
Milieu
Experience Manager
Uitgave/Symptomen
De JAVA-toepassing wordt langzamer uitgevoerd en er is ten slotte onvoldoende geheugen of er wordt een fout weergegeven in de logbestanden of in de uitvoer van de console 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 standaard heapgeheugeninstellingen van Java. Dit betekent dat de parameter jvm -Xmx
niet is opgegeven. CRX of CQ hebben minstens 256 MB heap nodig die is toegewezen voor uitvoering. 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 genoemd een geheugenlek, zie hiervoor meer informatie. Zie de onderstaande sectie over het analyseren van geheugenproblemen in Java-toepassingen.
creeer heap stortplaats:
Automatisch een heapdump genereren
Als u automatisch een heapdump wilt maken wanneer er onvoldoende geheugen beschikbaar is, kunt u de JVm-parameter -XX:+HeapDumpOnOutOfMemoryError
toevoegen om automatisch een heapdump te genereren wanneer de toepassing een OutOfMemoryError genereert. Bijvoorbeeld:
java -Xmx256m -XX:+HeapDumpOnOutOfMemoryError -jar *.jar
Dit produceert een dossier van de heap stortplaats (java_...hprof
) in de werkende folder van het proces wanneer het Java proces uit geheugen loopt. Het proces kan blijven lopen nadat de heapstortplaats werd geproduceerd. Gewoonlijk is één heap-dump-bestand voldoende om het probleem te analyseren.
Nota: als u crx-quickstart/server/start
manuscript gebruikt om uw instantie van CRX te beginnen dan kunt u -XX:+HeapDumpOnOutOfMemoryError
aan de CQ_JVM_OPTS
variabele toevoegen (zorg ervoor dat de variabele ook niet gecommentarieerd 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. Voer ps -ef | grep java
uit vanaf de opdrachtregel. Controleer vervolgens of u -XX:+HeapDumpOnOutOfMemoryError
ziet als een parameter van het Java-proces in CRX.
Als u een andere map moet opgeven om de heap-dump te genereren vanwege beperkingen van de schijfruimte, kunt u de parameter -XX:HeapDumpPath=/path/to/generate/heapdump
toevoegen om de jvm te vertellen waar het bestand moet worden geplaatst.
Zie hiervoor een verwijzing van het zuiveren van verwante parameters jvm.
produceer manueel een heapstortplaats
Zon/Oracle JVM
Als u handmatig een heapdump wilt genereren, voert u deze opdracht uit (u vindt jmap en jps in de map bin
van de hoofdmap van uw jdk):
-
kijk omhoog de pid van het proces java u een stortplaats van de heap voor produceert.
- In Unix of Linux kan dit worden gedaan met
ps -ef | grep java
ofjps -l
- In Vensters kan dit worden gedaan door de taakmanager te openen, druk
Ctrl+Shift+Esc
dan naar Mening gaan dan naar Uitgezochte Kolommen gaan dan naar PID (het Herkenningsteken van het Proces) ofjps -l
- In Unix of Linux kan dit worden gedaan met
-
Voer de onderstaande jmap-opdracht uit, vervang
/path/to/generate/heapdumpfile.hprof
door de locatie waar u het heap-dump-bestand wilt genereren en vervang1234
door de id 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 verscheidene soorten dumps, maar u hebt over het algemeen de volledige systeemstortplaats nodig om 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.
Voor meer informatie, zie de documentatie van de verkoper hier.
Waarschuwing: de stortplaatsdossiers van de heap zijn groot en kunnen tot de zelfde grootte op schijf zoals uw maximum heap - Xmx jvm parameterconfiguratie zijn. Zorg ervoor dat u genoeg schijfruimte hebt die aan de folder wordt toegewezen waar het stortplaatsdossier wordt geproduceerd.
analyseert heapstortplaats
Een goed hulpmiddel om heapdumps te analyseren is EclipseMAT (de Analysator van het Geheugen van de Verduistering).
Dit hulpmiddel kan IBM JVM geproduceerde dumps niet analyseren. Daarvoor zijn er verschillende mogelijkheden. IBM HeapAnalyzerzal goed voor de heapdumps in formaat doen PHD of klassiek.
voor een volledige analyse van de systeemstortplaats, gebruik de Hulp Workbench van de Steun van IBM, met de Controle en de Diagnostische Hulpmiddelen van IBM voor Java - de Analysator van het Geheugenbovenop 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. Om het te krijgen, looppas ps or (if available), run:
Histogram van de Hoop
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. Voer ps
of (indien beschikbaar) uit om dit op te halen:
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 het versienummer van alle geïnstalleerde hotfixes.
- Besturingssysteem, JVM-leverancier en versie.
Verwijzingen
[
1 ]
het Centrum van de Hulp van het Oracle >
Gids van het Oplossen van problemen voor HotSpot VM[
2 ]
Oracle.com >
javas >
DebuggingOptions