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.
Parallele GC
UseParNewGC
Der vielleicht einfachste Weg, dies zu verstehen, waren Kombinationen von Garbage Collection-Algorithmen von Alexey Ragozin
Code-Snippet anzeigen
Fazit:
quelle
-XX:-UseParallelGC
.-XX:+UseParallelGC
Leads verwendet die parallele GC für junge und alte GC für moderne JVMs. Siehe bugs.openjdk.java.net/browse/…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
quelle
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.
quelle