it-swarm.com.de

Java Garbage Collection Log messages

Ich habe Java zum Speichern von Garbage Collection-Informationen in den Protokollen konfiguriert ( verbose GC ). Ich bin mir nicht sicher, was die Garbage Collection-Einträge in den Protokollen bedeuten. Ein Beispiel für Diese Einträge sind unten veröffentlicht. Ich habe auf Google gesucht und keine soliden Erklärungen gefunden.

Ich habe einige vernünftige Vermutungen, suche aber nach Antworten, die genau definieren, was die Zahlen in den Einträgen bedeuten, und die von glaubwürdigen Quellen gestützt werden. Eine automatische +1 auf alle Antworten, die Sun-Dokumentation zitieren. Meine Fragen sind:

  1. Worauf bezieht sich PSYoungGen? Ich nehme an, es hat etwas mit der vorherigen (jüngeren?) Generation zu tun, aber was genau?
  2. Was ist der Unterschied zwischen dem zweiten Triplett von Zahlen und dem ersten?
  3. Warum ist ein Name (PSYoungGen) für das erste Triplett von Zahlen angegeben, aber nicht für das zweite?
  4. Was bedeutet jede Zahl (Speichergröße) im Triplett? Beispielsweise ist in 109884K-> 14201K (139904K) der Speicher vor dem GC 109884k und wird dann auf 14201K reduziert. Wie ist die dritte Zahl relevant? Warum brauchen wir einen zweiten Satz von Zahlen?

8109,128: [GC [PSYoungGen: 109884 K → 14201 K (139904 K)] 691015 K → 595332 K (1119040 K), 0,0454530 Sek.]

8112,111: [GC [PSYoungGen: 126649 K -> 15528 K (142336 K)] 707780 K -> 605892 K (1121472 K), 0,0934560 Sek.]

8112.802: [GC [PSYoungGen: 130344 K → 3732 K (118592 K)] 720708 K → 607895 K (1097728 K), 0,0682690 Sek.]

94
Ethan Heilman

Das meiste wird im GC Tuning Guide erklärt (was Sie sowieso gut lesen sollten).

Die Befehlszeilenoption -verbose:gc bewirkt, dass Informationen über die Heap- und Garbage-Auflistung bei jeder Auflistung gedruckt werden. Beispiel: Hier wird von einer großen Serveranwendung ausgegeben:

[GC 325407K->83000K(776768K), 0.2300771 secs]
[GC 325816K->83372K(776768K), 0.2454258 secs]
[Full GC 267628K->83769K(776768K), 1.8479984 secs]

Hier sehen wir zwei kleinere Sammlungen, gefolgt von einer größeren Sammlung. Die Zahlen vor und nach dem Pfeil (z. B. 325407K->83000K aus der ersten Zeile) geben die kombinierte Größe der aktiven Objekte vor bzw. nach der Speicherbereinigung an. Nach kleineren Sammlungen enthält die Größe einige Objekte, die nicht mehr aktuell sind, die jedoch nicht zurückgefordert werden können. Diese Objekte sind entweder in der Tenured Generation enthalten oder werden von der Tenured Generation oder der Permanent Generation referenziert.

Die nächste Zahl in Klammern (z. B. (776768K) (wieder aus der ersten Zeile) ist die festgeschriebene Größe des Heapspeichers: die Menge an Speicherplatz, die für Java Objekte ohne Anforderung von mehr Speicher vom Betriebssystem verwendet werden kann. Beachten Sie, dass diese Nummer keinen enthält der Survivor Spaces, da immer nur einer verwendet werden kann und auch nicht die permanente Generierung enthält, die die von der virtuellen Maschine verwendeten Metadaten enthält.

Der letzte Eintrag in der Zeile (z. B. 0.2300771 secs) gibt die Zeit an, die für die Durchführung der Sammlung benötigt wird; in diesem Fall ungefähr eine Viertelsekunde.

Das Format für die Hauptsammlung in der dritten Zeile ist ähnlich.

Das Format der Ausgabe von -verbose:gc kann sich in zukünftigen Versionen ändern.

Ich bin mir nicht sicher, warum es einen PSYoungGen in deinem gibt. hast du den müllsammler gewechselt

90
Michael Myers
  1. PSYoungGen bezieht sich auf den für die Minor-Sammlung verwendeten Garbage Collector. PS steht für Parallel Scavenge.
  2. Der erste Satz von Zahlen ist die Vorher/Nachher-Größe der jungen Generation und der zweite Satz ist für den gesamten Haufen. ( Diagnose eines Garbage Collection-Problems Angabe des Formats)
  3. Der Name gibt die betreffende Generation und den betreffenden Kollektor an, der zweite Satz bezieht sich auf den gesamten Heap.

Ein Beispiel eines zugehörigen vollständigen GC zeigt auch die Kollektoren, die für die alten und permanenten Generationen verwendet wurden:

3.757: [Full GC [PSYoungGen: 2672K->0K(35584K)] 
            [ParOldGen: 3225K->5735K(43712K)] 5898K->5735K(79296K) 
            [PSPermGen: 13533K->13516K(27584K)], 0.0860402 secs]

Zuletzt eine Zeile Ihrer Beispielprotokollausgabe aufschlüsseln:

8109.128: [GC [PSYoungGen: 109884K->14201K(139904K)] 691015K->595332K(1119040K), 0.0454530 secs]
  • 107 MB , die vor der GC verwendet wurden, 14 MB , die nach der GC verwendet wurden, maximale Größe der jungen Generation 137 MB
  • 675Mb Heap vor dem GC, 581Mb Heap nach dem GC, 1 GB maximale Heap-Größe
  • kleine GC trat 8109,128 Sekunden seit dem Start der JVM auf und dauerte 0,04 Sekunden
127
michaeljoseph

Ich wollte nur erwähnen, dass man mit dem das ausführliche GC-Log bekommen kann

-XX:+PrintGCDetails 

parameter. Dann sehen Sie die Ausgabe von PSYoungGen oder PSPermGen wie in der Antwort.

Ebenfalls -Xloggc:gc.log scheint die gleiche Ausgabe zu erzeugen wie -verbose:gc aber Sie können eine Ausgabedatei in der ersten angeben.

Anwendungsbeispiel:

Java -Xloggc:./memory.log -XX:+PrintGCDetails Memory

Um die Daten besser zu visualisieren, können Sie gcviewer (eine aktuellere Version finden Sie auf github ).

Achten Sie auf die korrekte Eingabe der Parameter, ich habe das "+" vergessen und mein JBoss konnte ohne Fehlermeldung nicht gestartet werden!

23
Andrei