2013-10-16 13 views
17

Eine Produktionsumgebung wurde kürzlich sehr langsam. Die CPU des Prozesses nahm 200%. Es funktionierte jedoch weiter. Nach dem Neustart des Dienstes funktionierte es wieder normal. Ich habe mehrere Symptome: Der Par-Survivor Space-Heap war für eine lange Zeit leer und die Speicherbereinigung dauerte etwa 20% der CPU-Zeit.Old Gen Haufen ist voll und die Eden und Survivor sind niedrig und fast leer

JVM-Optionen:

X:+CMSParallelRemarkEnabled, -XX:+HeapDumpOnOutOfMemoryError, -XX:+UseConcMarkSweepGC, -    XX:+UseParNewGC, -XX:HeapDumpPath=heapdump.hprof, -XX:MaxNewSize=700m, -XX:MaxPermSize=786m, -XX:NewSize=700m, -XX:ParallelGCThreads=8, -XX:SurvivorRatio=25, -Xms2048m, -Xmx2048m 

    Arch amd64 
    Dispatcher Apache Tomcat 
    Dispatcher Version 7.0.27 
    Framework java 
    Heap initial (MB) 2048.0 
    Heap max (MB) 2022.125 
    Java version 1.6.0_35 
    Log path /opt/newrelic/logs/newrelic_agent.log 
    OS Linux 
    Processors 8 
    System Memory 8177.964, 8178.0 

Mehr Informationen im beigefügten Bild Wenn das Problem auf dem aufgetretenen Nicht-Heap den verwendeten Code-Cache und verwendet cms zul gen auf die Hälfte gesunken.

Ich nahm die Informationen aus dem Newrelic. enter image description here

Die Frage ist, warum der Server so langsam zu arbeiten beginnt.

Manchmal stoppt der Server vollständig, aber wir haben festgestellt, dass es ein Problem mit PDFBox gibt. Beim Hochladen einiger PDFs und einigen Schriftarten stürzt die JVM ab.

Weitere Informationen: Ich habe beobachtet, dass sich das Alte Gen täglich füllt. Jetzt starte ich den Server täglich neu. Nach dem Neustart ist alles schön und gut, aber das alte Gen füllt sich bis zum nächsten Tag und der Server verlangsamt sich bis zu einem Neustart.

+1

Also, was ist die Frage? –

+0

Wenn Ihr Dauerwelle-Platz erschöpft ist und Ihr neuer Platz fast leer ist, wäre es nicht sinnvoll, die Größe des neuen Platzes zu verringern und der Dauerwelle mehr Platz zuzuweisen? Wenn Sie dies tun und mit dem gleichen Problem enden, haben Sie möglicherweise ein Speicherleck. – TMN

+0

Die Dauerwelle enthält die kompilierten Klassen und einige andere Sachen. Das Problem, das ich sehe, ist, dass sich die Alte Generation aufbaut. Ich muss den Server jeden Tag neu starten, um wieder normal zu werden. Wenn die Dauergrafik (und der Rest) ausfällt, wird der Tomcat neu gestartet. – Bogdan

Antwort

22

Standardmäßig beginnt CMS, gleichzeitig zu sammeln, wenn OldGen 70% ist. Wenn Speicher unterhalb dieser Grenze nicht freigegeben werden kann, wird er permanent gleichzeitig ausgeführt, was den Betrieb erheblich verlangsamt. Wenn OldSpace fast die volle Nutzung von OldGen erreicht, wird es in Panik geraten und auf die GC-Pause zum Stoppen der Welt zurückfallen, die sehr lang sein kann (wie 20 Sekunden). Sie benötigen wahrscheinlich mehr Spielraum in OldGen (stellen Sie sicher, dass Ihre App keinen Speicherverlust hat!). Zusätzlich können Sie die Schwelle senken eine gleichzeitige Sammlung (Standard 70%)

-XX verwenden zu beginnen: + UseCMSInitiatingOccupancyOnly -XX: CMSInitiatingOccupancyFraction = 50

diese gleichzeitige Sammlung auslösen wird mit 50% Auslastung und Erhöhung Chance Start CMS terminiert GC rechtzeitig. Dies wird nur helfen, falls Ihre Zuweisungsrate zu hoch ist, aus Ihren Diagrammen sieht es so aus, als ob es nicht genug wäre - Headrooom/memleak + too high XX: CMSInitiatingOccupancyFraction. Gib mindestens 500MB zu 1 GB mehr OldGen Speicherplatz

+1

Das hat das Problem gelöst. Vielen Dank. Wir sind um 1 GB gestiegen und jetzt haben wir keine Probleme. – Bogdan

Verwandte Themen