2016-05-14 8 views
4

Ich habe eine JEE-Anwendung, die vor kurzem begonnen hat, Spitzen in der CPU-Nutzung zu sehen (z. B. 100% von 27 Kernen auf einem 40-Core-Server) und zunehmend längere Zeiträume Die Anwendung ist nicht verfügbar. Es ist sehr ähnliches Verhalten wie die Ausgabe in der folgenden Beitrag beschrieben, um die Tatsache zu schließen, dass der Anwendungsserver Prellen die Frage gehen weg macht, bis es wieder nach ein paar Stunden erscheint:JVM YoungGen 0%, Perm Gen 99%, OldGen Full

Old Gen heap is full and the Eden and Survivor are low and almost empty

ich einige genommen haben Core-Dump-Ausgänge, während die Anwendung dieses „friert“ erlebt, und ich bin die folgende JVM GC Ausgabe zu sehen:

PSYoungGen total 11221504K, used 2435K 
eden space 9238528K, 0% used 
from space 19829796K, 0% used 
to space 1970176K, 0% used 
ParOldGen total 39613440K, used 39276477K 
object space 39613440K, 99% used 
PSPermGen total 254976K, used 115497K 
object space 254976K, 45% used 

Basierend auf der referenzierten Post und die Ausgabe oben, ich glaube, ich verstehe, dass die „friert“ werden angetrieben durch den Müllsammler, der (umsonst?) auf dem ParOldGen-Raum läuft. Die Teile, die ich vermisse:

  1. Warum der PermGen Raum bei 45% bleibt verwendet. Das heißt, werden die ~ 39 GB Dinge in ParOldGen letztlich in PSPermGen übergehen?

  2. Was ist die Bedeutung des fast leeren PSYoungGen-Raums? Bedeutet das, dass die Anwendung im Steady-State keine/viele neue Objektinstanzen erzeugt?

Der Beitrag oben beschrieben, auch die Möglichkeit, zu ParOldGen „mehr Spielraum zu geben“, aber ich bin nicht klar, ob das bedeutet, dass die Gesamtspeichergröße über -Xmx erhöht oder wenn es ein expliziten JVM GC-Parameter. Ich sehe das Argument NewRatio steuert die Größe der jungen Generation im Vergleich zur alten Generation. Würde die Tatsache, dass das PSYoungGen im Wesentlichen leer ist, bedeuten, dass es zu groß ist, und dass ich einen kleineren NewRatio Wert verwenden sollte?

Vielen Dank im Voraus für jede Hilfe.

+0

Sachen aus alten gen zu permgn Raum nicht befördert zu werden, haben Sie wahrscheinlich ein Leck irgendwo in Permgen, erstellt Ihre App viele Klassen dynamisch? –

+0

Vielen Dank für Ihren Kommentar. Ich verstehe jetzt, dass Permgen Raum ist nicht Teil des Heaps (per http://stackoverflow.com/questions/2129044/java-heap-terminology-young-old-and-permanent-generationen ). Die App erstellt viele Klassen dynamisch. Offenbar haben wir entweder ein Speicherleck oder die Speicheranforderungen der App überschreiten den aktuellen Wert von -Xmx. –

+0

Sie erstellen dynamisch viele Klassen oder Objekte? Wenn Klassen dann Ihre Permgen voll werden, wenn Objekte dann altgen. –

Antwort

1

werden die ~ 39GB Sachen in ParOldGen letztlich in PSPermGen übergehen?

Der PermGen in Java 7 (ersetzt durch Metaspace in Java 8) dient zum Halten von Code. Die einzigen Dinge, die vom Heap zu PermGen gelangen, sind Byte-Codes. Wenn Sie also keine Klassen generieren oder laden, geht nichts von einem zum anderen. Sie sind verschiedene Räume.

Welche Bedeutung hat der fast leere PSYoungGen-Raum?

Das junge Gen ist nach einem vollständigen GC leer. Full GCs sind üblich, wenn Ihre alte Generation beginnt sich zu füllen.

Bedeutet dies, dass die Anwendung keine/viele neue Objektinstanzen im Steady-State erstellt?

Es ist eher zu bedeuten, es hat kürzlich Full GC-ed.

beschreibt die Möglichkeit, zu ParOldGen „mehr Spielraum zu geben“, aber ich bin nicht klar, ob das bedeutet, dass die Gesamtspeichergröße über -Xmx erhöht oder wenn es ein expliziten JVM GC-Parameter.

die maximale Heap-Erhöhung könnte man mehr Kopffreiheit geben, aber ich würde überprüfen Sie zuerst

  • Sie keinen Speicherverlust haben.
  • Sie können den Großteil Ihrer Daten nicht vom Heap verschieben, z. eine Datenbank oder einen nativen Speicher.

Würde die Tatsache, dass die PSYoungGen im Wesentlichen leer Mittelwert ist, dass es zu groß ist, und dass ich einen kleineren NewRatio Wert verwenden?

Das könnte Ihnen helfen, mehr Platz für das alte Gen zu bekommen, aber es könnte Ihnen nur ein bisschen mehr Zeit geben, bevor es nicht genug Speicher hat.

0

Warum der PermGen Raum bei 45% bleibt verwendet. Das heißt, werden die ~ 39 GB Dinge in ParOldGen letztlich in PSPermGen übergehen?

Nr OldGen & PermGen Räume geteilt werden kann. PSPermGen enthält meistens Klassen, die vom Klassenlader im PermGen-Bereich geladen wurden. ParOldGen enthält Heap-Speicher für langlebige Objekte.

In JDK 1.8 wurde PermGen durch Metaspace ersetzt. Weitere Informationen finden Sie unter article.

Siehe unten SE Fragen für weitere Informationen:

Java heap terminology: young, old and permanent generations?

Was die Bedeutung des fast leeren PSYoungGen Raumes ist? Bedeutet das, dass die Anwendung im Steady-State keine/viele neue Objektinstanzen erzeugt?

@Peter Lawrey hat es richtig beantwortet. Nach dem Voll GC ist YoungGen fast leer =>Sie nicht Müll aus kurzlebigen Objekten in Ihrer Anwendung anreicherte

Der Beitrag oben auch die Möglichkeit, „gibt mehr Spielraum“ zu ParOldGen beschreibt, aber ich Es ist nicht klar, ob das bedeutet, dass die gesamte Heap-Größe über -Xmx erhöht wird oder ob es einen expliziten JVM-GC-Parameter gibt.

Ihr altes Gen ist voll bedeutet, dass Ihre Anwendung Heap von langlebigen Objekten beibehalten wird. mit Profilierwerkzeuge wie visualvm oder MAT

Jetzt müssen Sie mögliche Speicherlecks (falls vorhanden) in der Anwendung überprüfen Wenn Sie keine Speicherlecks haben, können Sie Ihre Heap-Größe mit -Xmx erhöhen kann.

Würde die Tatsache, dass das PSYoungGen im Wesentlichen leer ist, bedeuten, dass es zu groß ist und dass ich einen kleineren NewRatio-Wert verwenden sollte?

Da Sie größere Haufen verwenden, empfehle ich Ihnen, G1GC-Algorithmus zu verwenden. Wenn Sie den G1GC-Algorithmus verwenden, passen Sie die Standardwerte nicht an, da der G1GC-Algorithmus für eine bessere Heap-Verwaltung sorgt.

Werfen Sie einen Blick auf Orakel Artikel über G1GC Schalter (Complete List of G1 GC Switches Abschnitt), Use Cases Artikel und damit verbundene Frage SE:

Java 7 (JDK 7) garbage collection and documentation on G1