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):

  1. 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 of jps -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) of jps -l
  2. Voer de onderstaande jmap-opdracht uit, vervang /path/to/generate/heapdumpfile.hprof door de locatie waar u het heap-dump-bestand wilt genereren en vervang 1234 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

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