webentwicklung-frage-antwort-db.com.de

was ist der Unterschied zwischen ParallelGC und ParallelOldGC?

Ich habe einige Fragen zum GC-Algorithmus: Wenn wir zuerst die Parameter UseSerialGC, UseParallelGC, UseParallelOldGC usw. verwenden, geben wir einen GC-Algorithmus an. Jeder von ihnen kann GC in jeder Generation machen, ist es richtig?

Wenn ich zum Beispiel "Java -XX: + UseSerialGC" verwende, wird bei allen Generierungen die serielle GC als GC-Algorithmus verwendet.

Zweitens kann ich ParallelGC in Old Gneneration und SerialGC in der Yong-Generation verwenden?

Das Letzte als Titel Was ist der Unterschied zwischen ParallelGC und ParallelOldGC?

23
leo

Schauen Sie sich den HotSpot VM Optionen an :

-XX: + UseParallelGC = Parallele Speicherbereinigung für Spülungen verwenden. (In 1.4.1 eingeführt).

-XX: + UseParallelOldGC = Parallele Garbage Collection für die vollständigen Collections verwenden. Durch Aktivieren dieser Option wird -XX: + UseParallelGC automatisch festgelegt. (In 5.0 Update 6 eingeführt.)

wobei Scavenges = Young Generation GC.

18
Pavan

Nun, nach langer Suche und Recherche ist das, was ich verstanden habe, wie folgt:

-XX: + UseParallelGC - Dies ermöglicht GC die Verwendung von mehrere Threads in Young Generation, aber für die alte/festgeschriebene Generierung noch Serial Mark und Compact Algorithmus wird verwendet.

-XX: + UseParallelOldGC - Dies ermöglicht GC die Verwendung des Parallel Mark and Compact-Algorithmus bei der Generierung von old/tenured.

Lass uns verstehen - 

Der Algorithmus und die Speicheranordnung, z. B. Markieren und Kopieren, Auswechseln von Leerzeichen, die in Young Generation funktionieren, funktionieren aus vielen Gründen nicht für Old Generation

Niedrige Sterblichkeit - In der alten Generation ist die "Sterblichkeitsrate" signifikant niedriger als in der jungen Generation. In einer typischen Java-Anwendung sterben die meisten Objekte schnell und wenige leben länger. Als Objekte, die in der jungen Generation überleben und zur alten Generation befördert werden, wird beobachtet, dass diese Objekte dazu neigen, ein längeres Leben zu führen. Dies führt zu einer sehr niedrigen Sterblichkeitsrate in der alten Generation im Vergleich zur jungen Generation.

Signifikant size - Die Old Generation ist deutlich größer als die Young Generation. Da sich die Young Generation schnell auflöst, steht für die vielen kurzlebigen Objekte (small Young Generation) relativ wenig Platz zur Verfügung. In der alten Generation sammeln sich Objekte mit der Zeit an. Daher muss in einer alten Generation viel mehr Platz vorhanden sein als in der jungen Generation (große alte Generation).

Wenig Zuordnung - In der alten Generation geschieht weniger Zuteilung als in der jungen Generation. Dies liegt daran, dass in der Alten Generation Objekte nur dann entstehen, wenn der Garbage Collector überlebende Objekte von der Jungen zur Alten Generation befördert. In der jungen Generation dagegen treten alle Objekte, die die Anwendung mit new erzeugt, d. H. Die Mehrzahl der Zuordnungen, in der jungen Generation auf.

Unter Berücksichtigung dieser Unterschiede wurde für die Young Generation ein Algorithmus gewählt, der die Müllsammlung so bald wie möglich beenden wird, da er wegen der hohen Sterblichkeitsrate häufig aufgerufen werden muss [Punkt (1)]. . Darüber hinaus muss der Algorithmus sicherstellen, dass eine möglichst effiziente Speicherzuordnung [Punkt (3)] möglich ist, da in der Young Generation viel zugeteilt wird. Der Mark-and-Copy-Algorithmus der Young Generation verfügt über diese Eigenschaften.

Andererseits, dieser Algorithmus ist für die alte Generation nicht sinnvoll. Die Situation ist anders: Der Müllsammler muss sich um viele Objekte in der Alten Generation (Punkt (2)) kümmern, und die meisten von ihnen sind noch am Leben; Nur ein kleiner Teil ist unerreichbar und kann freigesetzt werden [Punkt (1)]. Wenn der Garbage Collector alle überlebenden Objekte in jeder Garbage Collection kopieren würde, genau wie beim Markieren und Kopieren, würde er viel Zeit damit verbringen, diese zu kopieren, ohne viel zu gewinnen.

(), Der mark-and-sweep -Algorithmus wird mit der alten Generation erstellt, wobei nichts kopiert wird, sondern nur die nicht erreichbaren Objekte freigegeben werden. Da dieser Algorithmus zur Fragmentierung des Heap führt, hat man zusätzlich eine Variation des Mark-and-Sweep-Algorithmus in Betracht gezogen, bei der nach der Sweep-Phase eine Verdichtung vorgenommen wird, durch die die Fragmentierung ist reduziert. Dieser Algorithmus wird als mark-and-compact-Algorithmus bezeichnet.

Ein Markierungs- und Kompaktalgorithmus kann zeitaufwändig sein, da er den Objektgraphen in den folgenden Schritten durchlaufen muss.

  1. Markierung. 
  2. Berechnung neuer Standorte. 
  3. Referenzanpassungen. 
  4. Ziehen um

In der Phase {Berechnung des neuen Standorts wird versucht, ein Objekt zu finden, das sich in dieses Feld bewegen kann (Defragmentierung). Speichert das Paar zur Verwendung in späteren Phasen. Dadurch verbraucht der Algorithmus mehr Zeit.

Obwohl Mark and Compare einige Probleme löst, die sich auf die dauerhafte Generierung beziehen, hat es einige schwerwiegende Probleme, da dies ein STW-Ereignis (Stop the World) ist, das viel Zeit in Anspruch nimmt und die Anwendung erheblich beeinträchtigen kann.

Alternative Algorithmen für die alte Generation

Um die Pausenzeiten zu reduzieren, wurden Alternativen zum seriellen Markierungs- und Kompaktalgorithmus in Betracht gezogen:

Ein paralleler mark-and-compact-Algorithmus, der weiterhin alle Anwendungsthreads zwischenspeichert, dann jedoch die Beschriftung und anschließende Komprimierung mit mehreren Garbage Collector-Threads übernimmt. Während dies immer noch ein Stop-the-World-Ansatz ist, ist die resultierende Pause bei einer Multi-Core- oder Multi-Prozessor-Maschine kürzer als beim seriellen Mark-and-Compact-Algorithmus. Dieser parallele Algorithmus der alten Generation ("ParallelOld") ist seit Java 5 Update 6 verfügbar und wird mit der Option -XX: + UseParallelOldGC ausgewählt.

Ein konkurrierender Mark-and-Sweep Algorithmus, der der Anwendung zumindest teilweise Konkurrenz macht, ohne die Threads zu stoppen, und gelegentlich kurze Stop-the-World-Phasen benötigt. Dieser gleichzeitige Mark-and-Sweep-Algorithmus ("CMS") gibt es seit Java 1.4.1. Es wird mit der Option -XX: + UseConcMarkSweepGC eingeschaltet. Es ist wichtig, dass dies nur ein Mark-and-Sweep-Algorithmus ist. Es findet keine Verdichtung statt, was zu dem bereits diskutierten Problem der Fragmentierung führt.

Kurz gesagt, -XX: + UseParallelOldGC wird als Indikator für die Verwendung mehrerer Threads verwendet, während die Hauptsammlung mit dem Algorithmus Mark and Compact ausgeführt wird. Wenn dies stattdessen verwendet wird, sind die Minor-Collection oder die Young-Collection parallel, aber die Major-Collections sind immer noch ein Thread.

Ich hoffe das antwortet.

7
Dibyendu

Dies sind zwei gc-Richtlinien, die auf verschiedene Bereiche eines Java-Heap angewendet werden, nämlich Neue und Alte Generationen. Hier ist ein Link, der hilft zu klären, welche Optionen andere implizieren. Dies ist vor allem zu Beginn hilfreich, um zu verstehen, was Sie erhalten, wenn Sie beispielsweise ParallelOldGC oder ParNewGC angeben. http://www.fasterj.com/articles/oraclecollectors1.shtml

1
shuhradk

Aus Oracle Java SE 8-Dokumenten:

https://docs.Oracle.com/javase/8/docs/technotes/guides/vm/gctuning/collectors.html

Der Parallelkollektor (auch als Durchsatzkollektor bezeichnet) führt kleinere Sammlungen parallel durch, wodurch der Aufwand für die Sammlung von Speicherbereinigungen erheblich reduziert werden kann. Es ist für Anwendungen mit mittleren bis großen Datensätzen gedacht, die auf Multiprozessor- oder Multithread-Hardware ausgeführt werden. Der Parallelkollektor ist bei bestimmten Hardware- und Betriebssystemkonfigurationen standardmäßig ausgewählt oder kann mit der Option -XX: + UseParallelGC explizit aktiviert werden.

Die parallele Verdichtung ist eine Funktion, mit der der parallele Kollektor die wichtigsten Sammlungen parallel ausführen kann. Ohne Parallelkomprimierung werden Hauptsammlungen mit einem einzigen Thread durchgeführt, wodurch die Skalierbarkeit erheblich eingeschränkt werden kann. Die parallele Verdichtung ist standardmäßig aktiviert, wenn die Option -XX: + UseParallelGC angegeben wurde. Die Option zum Ausschalten lautet -XX: -UseParallelOldGC.

Wenn Sie also -XX: + UseParallelGC angeben, wird die Hauptauflistung standardmäßig auch mit mehreren Threads durchgeführt. Umgekehrt gilt auch, wenn Sie -XX: + UseParallelOldGC angeben, werden auch kleinere Sammlungen mit mehreren Threads durchgeführt.

0
Dev