Unterschied zwischen -XX: + UseParallelGC und -XX: + UseParNewGC

81

Sie sind Algorithmen für die Speicherbereinigung der jungen Generation.

Die zweite (UseParNewGC) wird automatisch mit der Garbage Collection der gleichzeitigen Tenured Generation aktiviert (siehe Java Concurrent und Parallel GC ). Gibt es jedoch einen Unterschied zwischen den beiden parallelen Algorithmen?

fglez
quelle

Antworten:

119

Nach langem Suchen habe ich die beste Erklärung auf der Java Performance Tuning-Website in Frage des Monats gefunden: 1.4.1 Garbage Collection-Algorithmen, 29. Januar 2003

Garbage Collection-Algorithmen der jungen Generation

Der (Original-) Kopiersammler (standardmäßig aktiviert). Wenn dieser Kollektor aktiviert wird, werden alle Anwendungsthreads gestoppt und das Kopieren wird mit einem Thread fortgesetzt (was bedeutet, dass nur eine CPU vorhanden ist, selbst wenn auf einem Computer mit mehreren CPUs). Dies wird als Stop-the-World-Sammlung bezeichnet, da die JVM im Grunde alles andere pausiert, bis die Sammlung abgeschlossen ist.

Der Kollektor für paralleles Kopieren (Aktiviert mit -XX: + UseParNewGC). Wie der ursprüngliche Kopiersammler ist auch dieser ein Stop-the-World-Sammler. Dieser Kollektor parallelisiert jedoch die Kopiersammlung über mehrere Threads, was effizienter ist als der ursprüngliche Single-Thread-Kopierkollektor für Computer mit mehreren CPUs (jedoch nicht für Computer mit einer CPU). Dieser Algorithmus beschleunigt möglicherweise die Sammlung junger Generationen um einen Faktor, der der Anzahl der verfügbaren CPUs im Vergleich zum ursprünglichen Kopierkollektor mit einem Thread entspricht.

Der Parallel Scavenge Collector (Aktiviert mit -XX: UseParallelGC). Dies ist wie beim vorherigen Parallelkopierkollektor, aber der Algorithmus ist auf Gigabyte-Heaps (über 10 GB) auf Computern mit mehreren CPUs abgestimmt. Dieser Erfassungsalgorithmus wurde entwickelt, um den Durchsatz zu maximieren und Pausen zu minimieren. Es verfügt über eine optionale adaptive Optimierungsrichtlinie, mit der die Größe von Heapspeichern automatisch geändert wird. Wenn Sie diesen Kollektor verwenden, können Sie nur den ursprünglichen Mark-Sweep-Kollektor der alten Generation verwenden (dh der neuere gleichzeitige Kollektor der alten Generation kann nicht mit diesem Kollektor der jungen Generation arbeiten).

Aus diesen Informationen geht hervor, dass der Hauptunterschied (abgesehen von der CMS-Zusammenarbeit) darin besteht, dass UseParallelGC die Ergonomie unterstützt, UseParNewGC jedoch nicht.

fglez
quelle
3
Etwas aktueller Link schnellerj.com/articles/oraclecollectors1.shtml
Phunehehe
@phunehehe Danke für den Link! Es ist sehr hilfreich.
The Student Soul
21

Parallele GC

  • XX: + UseParallelGC Verwenden Sie die parallele Speicherbereinigung für das Aufräumen. (Eingeführt in 1.4.1)
  • XX: + UseParallelOldGC Verwenden Sie die parallele Garbage Collection für die vollständigen Sammlungen. Durch Aktivieren dieser Option wird automatisch -XX: + UseParallelGC festgelegt. (Eingeführt in 5.0 Update 6.)

UseParNewGC

UseParNewGC Eine parallele Version des Kopierkollektors der jungen Generation wird mit dem gleichzeitigen Kollektor verwendet (dh wenn -XX: + UseConcMarkSweepGC in der Befehlszeile verwendet wird, wird das Flag UseParNewGC auch auf true gesetzt, wenn es in der Befehlszeile nicht anderweitig explizit gesetzt ist ).

Der vielleicht einfachste Weg, dies zu verstehen, waren Kombinationen von Garbage Collection-Algorithmen von Alexey Ragozin

Fazit:

  1. Wenden Sie -XX: + UseParallelGC an, wenn Sie eine parallele Erfassungsmethode NUR für die JUNGE Generierung benötigen , ( aber immer noch) die serielle Mark-Sweep-Methode als Sammlung für die ALTE Generierung verwenden
  2. Wenden Sie -XX: + UseParallelOldGC an, wenn Sie eine parallele Erfassungsmethode für die JUNGE Generierung benötigen (setzt automatisch -XX: + UseParallelGC) und die ALTE Generierungserfassung
  3. Wenden Sie -XX: + UseParNewGC & -XX: + UseConcMarkSweepGC an, wenn Sie eine parallele Erfassungsmethode für die JUNGE Generierung benötigen UND die CMS-Methode als Sammlung für den Speicher der ALTEN Generierung benötigen
  4. Sie können -XX: + UseParallelGC oder -XX: + UseParallelOldGC nicht gleichzeitig mit -XX: + UseConcMarkSweepGC anwenden. Deshalb müssen Sie -XX: + UseParNewGC mit CMS koppeln, andernfalls verwenden Sie -XX: + UseSerialGC explizit ODER -XX: - Verwenden Sie ParNewGC, wenn Sie die serielle Methode gegen junge Generationen anwenden möchten
Ivan Herlambang
quelle
Muss sein -XX:-UseParallelGC.
Minas Mina
Hinweis: Schlussfolgerung Nr. 1 ist nicht mehr korrekt. Das Anwenden von -XX:+UseParallelGCLeads verwendet die parallele GC für junge und alte GC für moderne JVMs. Siehe bugs.openjdk.java.net/browse/…
turbanoff
15

UseParNewGC, das normalerweise als "Parallel Collector der jungen Generation" bezeichnet wird, ist in jeder Hinsicht dasselbe wie der Parallel Garbage Collector (-XX: + UseParallelGC), mit der Ausnahme, dass er ausgefeilter und effizienter ist. Es kann auch mit einem "gleichzeitigen Low-Pause-Kollektor" verwendet werden.

Siehe Java GC FAQ , Frage 22 für weitere Informationen.

Beachten Sie, dass bei UseParNewGC einige Fehler bekannt sind

Suraj Chandran
quelle
8
Wissen Sie, welche bekannten Fehler oder welche JVM-Version sie hat?
Fglez
3

Die Verwendung von -XX: + UseParNewGC zusammen mit -XX: + UseConcMarkSweepGC führt zu einer längeren Pausenzeit für kleinere GCs im Vergleich zu -XX: + UseParallelGC.

Dies liegt daran, dass für die Förderung von Objekten von der jungen zur alten Generation ein Best-Fit-Algorithmus (aufgrund der Fragmentierung der alten Generation) ausgeführt werden muss, um eine Adresse für dieses Objekt zu finden.
Das Ausführen eines solchen Algorithmus ist bei Verwendung von -XX: + UseParallelGC nicht erforderlich, da + UseParallelGC nur mit MarkandCompact Collector konfiguriert werden kann. In diesem Fall liegt keine Fragmentierung vor.

Avinash Ganta
quelle
Dies ist eine wirklich gute Einsicht. Haben Sie Tests durchgeführt, um dies zu bestätigen?
Fglez