Erfahren Sie mehr über G1 im Detail, verstehen Sie G1, ausführliche Erklärung des G1-Garbage Collectors, einfache Optimierung des G1 Garbage Collectors

4. Erfahren Sie mehr über G1 im Detail:
4.1. Erstens: Was ist Garbage Collection
4.2. G1 verstehen
4.3. G1 Yong GC
4.4. G1 Mix GC
4.5. Dreifarbiger Markierungsalgorithmus
4.6. Optimierungspraxis
5. Detaillierte Erklärung des G1 Garbage Collectors
5.1. G1-Garbage-Collector
5.2. G1-Heap-Speicheraufteilung 5.3
. G1-Laufprozess
5.4. Dreifarbige Markierung
5.4.1. Problem fehlender Markierungen
5.5. Speichersatz und Kartentabelle
5.6. Sicherer Punkt und sicherer Bereich
6. Einfache Abstimmung des G1-Garbage-Collectors
6.1 . Heap
6.2. Nach Java 9 aktivierte Parameter
6.3. GC-Phase von G1
6.4. Young Only-Phase
6.5. Gemischte GC-Phase
6.6. Vollständige GC-Phase
6.7. Erster Blick auf den GC-Zyklus
6.8. GC-Protokoll

4. Erfahren Sie mehr über G1:

Neu gepostet von: https://www.cnblogs.com/lsgxeva/p/10231201.html

4.1.1: Was ist Garbage Collection?

Bevor wir G1 verstehen, müssen wir zunächst klar wissen, was Garbage Collection ist. Einfach ausgedrückt besteht die Garbage Collection darin, Objekte zurückzugewinnen, die nicht mehr im Speicher verwendet werden.

Die grundlegenden Schritte der Garbage Collection:
1. Suchen Sie nach Objekten, die nicht mehr im Speicher verwendet werden.
2. Geben Sie den von diesen Objekten belegten Speicher frei.

1. Finden Sie Objekte, die nicht mehr im Speicher verwendet werden.
Die Frage ist also, wie man beurteilen kann, welche Objekte nicht mehr verwendet werden. Wir haben auch zwei Methoden:
A: Referenzzählmethode
Die Referenzzählmethode bedeutet, dass ein Objekt, auf das keine Referenz verweist, als Müll betrachtet werden kann. Der Nachteil dieser Methode besteht darin, dass sie die Existenz von Ringen nicht erkennen kann.

B: Root-Suchalgorithmus (Zugänglichkeitsanalysealgorithmus)
Die Grundidee des Root-Suchalgorithmus besteht darin, eine Reihe von Objekten mit dem Namen „GC Roots“ als Ausgangspunkt zu verwenden und von diesen Knoten aus mit der Suche nach unten zu beginnen Die Suche wird als Referenzkette (Referenzkette) bezeichnet. Wenn ein Objekt ohne Referenzkette mit GC Roots verbunden ist, beweist dies, dass das Objekt nicht verfügbar ist.

Nachdem wir nun wissen, wie man Müllobjekte findet, wie bereinigen wir sie?

2. Geben Sie den von diesen Objekten belegten Speicher frei. Zu
den gängigen Methoden gehören Kopieren oder direktes Bereinigen. Das direkte Bereinigen führt jedoch zu einer Speicherfragmentierung, sodass die Methode des Bereinigens und Komprimierens entsteht.

Im Allgemeinen gibt es drei Arten von Recycling-Algorithmen.
A. Mark-Copy
: Es teilt die verfügbare Speicherkapazität in zwei gleich große Teile auf und verwendet jeweils nur einen davon. Wenn dieser Block aufgebraucht ist, kopieren Sie das verbleibende Objekt in einen anderen Block und bereinigen Sie dann den verwendeten Speicherplatz auf einmal. Seine Vorteile sind einfache Implementierung, hohe Effizienz und keine Speicherfragmentierung. Der Nachteil besteht darin, dass die Verwaltung doppelt so viel Speicher erfordert.

B. Markieren und Reinigen
Der Algorithmus zum Löschen von Markierungen ist in zwei Phasen unterteilt: „Markieren“ und „Löschen“: Markieren Sie zunächst die Objekte, die recycelt werden müssen, und löschen Sie die Objekte nach Abschluss der Markierung gleichmäßig. Sein Vorteil ist die hohe Effizienz, sein Nachteil ist die Anfälligkeit für Speicherfragmentierung.

C. Markieren-Reinigen
Der Markierungsvorgang steht im Einklang mit dem „Markierungs-Reinigen“-Algorithmus. Nachfolgende Vorgänge bereinigen nicht nur Objekte direkt, sondern verschieben alle überlebenden Objekte nach dem Bereinigen nutzloser Objekte an ein Ende und aktualisieren die Zeiger, auf die verwiesen wird ihre Objekte. Da Objekte verschoben werden, ist es weniger effizient als „Mark-and-Clean“, verursacht aber keine Speicherfragmentierung.

3. Basierend auf Generationsannahmen
Da die Überlebenszeit von Objekten lang oder kurz sein kann, kann bei Objekten mit langer Überlebenszeit durch Reduzierung der Anzahl der GCs unnötiger Overhead vermieden werden. Auf diese Weise teilen wir den Speicher in die neue Generation und die alte Generation auf. Die neue Generation speichert die neu erstellten Objekte mit einer relativ kurzen Überlebenszeit.

4. Geschichte des Java Garbage Collectors

  • Die erste Stufe, der serielle (serielle) Kollektor.
    Vor jdk1.3.1 kann die Java Virtual Machine nur den seriellen Kollektor verwenden. Der serielle Kollektor ist ein Single-Threaded-Kollektor, aber seine Bedeutung „Single-Threaded“ bedeutet nicht nur, dass er nur eine CPU oder einen Sammelthread verwendet, um die Garbage-Collection-Arbeit abzuschließen, sondern, was noch wichtiger ist, er wird für die Garbage-Collection verwendet . müssen alle anderen Arbeitsthreads angehalten werden, bis die Sammlung abgeschlossen ist.

PS: So öffnen Sie den Serial Collector

-XX:+UseSerialGC
  • Die zweite Stufe, der parallele (parallele) Kollektor
    , wird auch als Durchsatzkollektor bezeichnet. Im Vergleich zum seriellen Kollektor besteht der Hauptvorteil von Parallel darin, dass er Multithreading verwendet, um die Müllbereinigung abzuschließen, wodurch die Eigenschaften von Multi-Kollektoren voll ausgenutzt werden können. Kern, reduziert die GC-Zeit erheblich.
    PS: So öffnen Sie den Parallelkollektor
-XX:+UseParallelGC -XX:+UseParallelOldGC
  • In der dritten Stufe setzt der CMS-Kollektor (gleichzeitig)
    den CMS-Kollektor alle Anwendungsthreads während der Minor-GC an und führt die Speicherbereinigung auf Multithread-Art durch. Während der vollständigen GC wird der Anwendungsthread nicht mehr angehalten, sondern mehrere Hintergrundthreads werden verwendet, um den Speicherplatz der alten Generation regelmäßig zu scannen und nicht verwendete Objekte rechtzeitig zurückzugewinnen.
    PS: So öffnen Sie den CMS-Kollektor
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC
  • Die vierte Stufe, der G1-Kollektor (gleichzeitig).
    Der G1-Kollektor (oder Garbage-First-Kollektor) ist darauf ausgelegt, Pausen bei der Verarbeitung sehr großer Heaps (größer als 4 GB) zu minimieren. Im Vergleich zum Vorteil von CMS wird die Erzeugungsrate der Speicherfragmentierung erheblich reduziert.

PS: So öffnen Sie den G1-Kollektor

-XX:+UseG1GC

4.2. G1 verstehen

Das erste Papier (Anhang 1) von G1 wurde 2004 veröffentlicht und war 2012 nur in jdk1.7u4 verfügbar. Oracle plant offiziell, G1 zum Standard-Garbage Collector in jdk9 zu machen, um CMS zu ersetzen. Warum empfiehlt Oracle dringend G1? Was sind die Vorteile von G1?

Das Designprinzip von G1 besteht zunächst in einer einfachen und realisierbaren Leistungsoptimierung.
Entwickler müssen lediglich die folgenden Parameter deklarieren:

-XX:+UseG1GC -Xmx32g -XX:MaxGCPauseMillis=200

Unter anderem dient -XX:+UseG1GC dazu, den G1-Garbage Collector zu aktivieren, -Xmx32g legt den maximalen Speicher des Heap-Speichers auf 32G fest und -XX:MaxGCPauseMillis=200 legt die maximale Pausenzeit von GC auf 200 ms fest. Wenn wir eine Optimierung vornehmen müssen, müssen wir bei einer bestimmten Speichergröße nur die maximale Pausenzeit ändern.

Zweitens hebt G1 die physische Raumaufteilung der neuen Generation und der alten Generation auf.
Auf diese Weise müssen wir nicht mehr jede Generation in einem separaten Raum einrichten und müssen uns keine Sorgen darüber machen, ob der Speicher jeder Generation ausreicht.
Fügen Sie hier eine Bildbeschreibung ein

Stattdessen unterteilt der G1-Algorithmus den Heap in mehrere Regionen (Regions), die weiterhin zum Generationskollektor gehören. Einige dieser Bereiche umfassen jedoch die neue Generation, und die Garbage Collection der neuen Generation verwendet immer noch die Methode, alle Anwendungsthreads anzuhalten, um überlebende Objekte in die alte Generation oder den Survivor-Bereich zu kopieren. Auch die alte Generation ist in viele Regionen unterteilt, und der G1-Kollektor schließt die Bereinigung ab, indem er Objekte von einer Region in eine andere kopiert. Dies bedeutet, dass G1 während der normalen Verarbeitung die Heap-Komprimierung (zumindest einen Teil der Heap-Komprimierung) abschließt, sodass keine Probleme mit der CMS-Speicherfragmentierung auftreten.
Fügen Sie hier eine Bildbeschreibung ein

In G1 gibt es auch einen speziellen Bereich namens Humongous-Bereich. Wenn ein Objekt mehr als 50 % der Partitionskapazität einnimmt, betrachtet der G1-Kollektor es als Riesenobjekt. Diese Riesenobjekte werden in der alten Generation standardmäßig direkt zugewiesen. Wenn es sich jedoch um kurzlebige Riesenobjekte handelt, wirkt sich dies negativ auf den Garbage Collector aus. Um dieses Problem zu lösen, teilt G1 einen Humongous-Bereich auf, der zum Speichern großer Objekte verwendet wird. Wenn ein großes Objekt nicht in einem H-Bereich untergebracht werden kann, sucht G1 nach fortlaufenden H-Partitionen, um es zu speichern. Um kontinuierliche H-Bereiche zu finden, muss manchmal eine vollständige GC gestartet werden.

PS: In Java 8 wird die persistente Generation ebenfalls in den normalen Heap-Speicherbereich verschoben und in Metaspace geändert.

Objektzuteilungsstrategie
Wenn wir über die Zuteilung großer Objekte sprechen, müssen wir über die Objektzuteilungsstrategie sprechen. Es ist in drei Stufen unterteilt:
1.TLAB (Thread Local Allocation Buffer) ist der lokale Thread-Zuordnungspuffer.
2. Zugeteilt im Bezirk Eden.
3. Riesige Flächenaufteilung.

TLAB weist Threads lokal Puffer zu und dient dazu, Objekte so schnell wie möglich zuzuordnen. Wenn die Objekte in einem gemeinsam genutzten Bereich zugewiesen werden, müssen wir einen Synchronisierungsmechanismus verwenden, um die Zeiger auf freien Speicherplatz in diesen Bereichen zu verwalten. Im Eden-Raum verfügt jeder Thread über eine feste Partition zum Zuweisen von Objekten, also ein TLAB. Bei der Zuweisung von Objekten ist keine Synchronisierung zwischen Threads mehr erforderlich.

Bei Objekten, die nicht im TLAB-Raum zugewiesen werden können, versucht die JVM, sie im Eden-Raum zuzuweisen. Wenn der Eden-Raum das Objekt nicht aufnehmen kann, kann der Raum nur in der alten Generation zugewiesen werden.

Schließlich bietet G1 zwei GC-Modi, Young GC und Mixed GC, die beide Stop The World (STW) sind. Im Folgenden werden wir diese beiden Modi getrennt vorstellen.

4.3. G1 Yong GC

Young GC dient hauptsächlich der GC des Eden-Bereichs und wird ausgelöst, wenn der Eden-Bereich erschöpft ist. In diesem Fall werden die Daten im Eden-Raum in den Survivor-Raum verschoben. Wenn der Survivor-Raum nicht ausreicht, wird ein Teil der Daten im Eden-Raum direkt in den Raum der alten Generation befördert. Die Daten im Survivor-Bereich werden in den neuen Survivor-Bereich verschoben, und einige Daten werden auch in den Bereich der alten Generation hochgestuft. Am Ende sind die Daten im Eden-Raum leer, der GC funktioniert nicht mehr und der Anwendungsthread wird weiterhin ausgeführt.
Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein

Zu diesem Zeitpunkt müssen wir ein Problem berücksichtigen: Wenn nur GC-Objekte der neuen Generation vorhanden sind, wie finden wir alle Stammobjekte? Sind alle Objekte in der alten Generation verwurzelt? Es wird viel Zeit in Anspruch nehmen, auf diese Weise zu scannen. Daher führte G1 das Konzept von RSet ein. Sein vollständiger Name ist Remembered Set und seine Funktion besteht darin, Objektreferenzen zu verfolgen, die auf einen bestimmten Heap-Bereich verweisen.
Fügen Sie hier eine Bildbeschreibung ein

Im CMS gibt es auch das Konzept von RSet. In der alten Generation gibt es einen Bereich zum Aufzeichnen von Verweisen auf die neue Generation. Dies ist ein Hinweis: Bei der Durchführung von Young GC muss beim Scannen der Wurzel nur dieser Bereich gescannt werden, nicht die gesamte alte Generation.

In G1 wird Point-Out jedoch nicht verwendet. Dies liegt daran, dass eine Partition zu klein ist und zu viele Partitionen vorhanden sind. Wenn Point-Out verwendet wird, führt dies zu viel Scan-Verschwendung. Einige Partitionsreferenzen, für die kein GC erforderlich ist werden ebenfalls gescannt. Also verwendet G1 Point-In, um es zu lösen. Point-in bedeutet, welche Partitionen auf Objekte in der aktuellen Partition verweisen. Auf diese Weise werden ungültige Scans vermieden, indem nur diese Objekte als Roots gescannt werden. Müssen wir Referenzen zwischen neuen Generationen aufzeichnen, da es mehrere neue Generationen gibt? Dies ist unnötig, da bei jedem GC alle jungen Generationen gescannt werden, sodass nur die Referenzen zwischen der alten und der neuen Generation aufgezeichnet werden müssen.

Es ist zu beachten, dass bei vielen referenzierten Objekten der Evaluator jede Referenz verarbeiten muss und der Evaluator-Overhead sehr groß sein wird. Um das Problem des Evaluator-Overheads zu lösen, wird in G1 ein anderes Konzept eingeführt, die Kartentabelle ( Kartentisch). Eine Kartentabelle unterteilt eine Partition logisch in kontinuierliche Bereiche fester Größe, und jeder Bereich wird als Karte bezeichnet. Karten sind normalerweise kleiner und liegen zwischen 128 und 512 Byte. Die Kartentabelle ist normalerweise ein Byte-Array, und die Raumadresse jeder Partition wird durch den Index der Karte (dh den Index des Arrays) identifiziert. Standardmäßig ist jede Karte nicht referenziert. Wenn auf einen Adressraum verwiesen wird, wird der diesem Adressraum entsprechende Wert des Array-Index als „0“ markiert, dh er wird als schmutzig markiert und referenziert, und RSet zeichnet auch den Array-Index auf. Im Allgemeinen handelt es sich bei diesem RSet tatsächlich um eine Hash-Tabelle, der Schlüssel ist die Startadresse anderer Regionen und der Wert ist eine Sammlung, deren Elemente der Index der Kartentabelle sind.

Junge GC-Phase:

  • Phase 1: Root Scan
    Statische und lokale Objekte werden gescannt.

  • Phase 2: RS aktualisieren.
    Verarbeitung der Aktualisierung der RS ​​für die Dirty-Card-Warteschlange.

  • Phase 3: Verarbeiten Sie RS
    , um Objekte zu erkennen, die von der jungen Generation auf die alte Generation verweisen.

  • Phase 4: Objektkopie
    Kopieren Sie das überlebende Objekt in den überlebenden/alten Bereich.

  • Phase 5: Verarbeitung von Referenzwarteschlangen.
    Soft-Referenzen, schwache Referenzen und Phantom-Referenzverarbeitung.

4.4.G1 GC mischen

Mix GC führt nicht nur die normale Garbage Collection der neuen Generation durch, sondern stellt auch einige Partitionen der alten Generation wieder her, die durch Hintergrund-Scan-Threads markiert wurden.

Seine GC-Schritte sind in zwei Schritte unterteilt:

  • Globale gleichzeitige Markierung
  • Überlebende Objekte kopieren (Evakuierung)

Vor der Durchführung von Mix GC wird zunächst eine globale gleichzeitige Markierung (globale gleichzeitige Markierung) durchgeführt. Was ist der Ausführungsprozess der globalen gleichzeitigen Markierung?

Bei G1 GC werden hauptsächlich Markierungsdienste für gemischte GC bereitgestellt und sind kein notwendiger Bestandteil eines GC-Prozesses. Der Ausführungsprozess der globalen gleichzeitigen Markierung ist in fünf Schritte unterteilt:

  • Anfangsmarkierung (Initial Mark, STW)
    In dieser Phase markiert der G1 GC die Wurzel. Diese Phase steht in engem Zusammenhang mit der regulären (STW) Müllabfuhr der jungen Generation.

  • Root-Region-Scan (Root-Region-Scan)
    G1 GC scannt Verweise auf die alte Generation im zunächst markierten Überlebensbereich und markiert die referenzierten Objekte. Diese Phase wird gleichzeitig mit der Anwendung (nicht STW) ausgeführt, und die nächste STW-Garbage Collection der jungen Generation kann erst beginnen, wenn diese Phase abgeschlossen ist.

  • Concurrent Marking
    G1 GC sucht im gesamten Heap nach erreichbaren (lebenden) Objekten. Diese Phase läuft parallel zur Anwendung und kann durch STW-Garbage Collections der jungen Generation unterbrochen werden.

  • Endnote (Bemerkung, STW)
    Diese Phase ist das STW-Recycling und trägt dazu bei, den Markierungszyklus abzuschließen. Der G1 GC löscht den SATB-Puffer, verfolgt Live-Objekte, auf die nicht zugegriffen wurde, und führt die Referenzverarbeitung durch.

  • Bereinigung (STW)
    In dieser letzten Phase führt der G1 GC die STW-Vorgänge der Statistik und RSet-Bereinigung durch. Während der Statistik identifiziert der G1 GC Regionen, die völlig frei sind, und Regionen, die für die gemischte Garbage Collection in Frage kommen. Die Bereinigungsphase erfolgt teilweise gleichzeitig mit dem Zurücksetzen des freien Speicherplatzes und dem Zurücksetzen in die Liste der freien Speicherplätze.

4.5. Dreifarbiger Markierungsalgorithmus

Wenn es um die gleichzeitige Markierung geht, müssen wir den dreifarbigen Markierungsalgorithmus der gleichzeitigen Markierung verstehen. Dies ist eine nützliche Methode zur Beschreibung eines Tracing-Kollektors und kann verwendet werden, um die Korrektheit des Kollektors abzuleiten. Zunächst unterteilen wir Objekte in drei Typen.

  • Schwarz: Das Stammobjekt oder sowohl das Objekt als auch seine untergeordneten Objekte werden gescannt.
  • Grau: Das Objekt selbst wurde gescannt, aber die Unterobjekte innerhalb dieses Objekts wurden noch nicht gescannt.
  • Weiß: Objekte, die nicht gescannt wurden. Nach dem Scannen aller Objekte sind die Objekte, die schließlich weiß sind, nicht erreichbare Objekte, also Müllobjekte

Wenn der GC mit dem Scannen von Objekten beginnt, scannen Sie die Objekte gemäß den folgenden Schritten: Das
Stammobjekt wird auf Schwarz und das untergeordnete Objekt auf Grau gesetzt.
Fügen Sie hier eine Bildbeschreibung ein
Gehen Sie weiter von Grau aus und setzen Sie die Objekte, die Unterobjekte gescannt haben, auf Schwarz.
Fügen Sie hier eine Bildbeschreibung ein
Nach dem Durchqueren aller erreichbaren Objekte werden alle erreichbaren Objekte schwarz. Nicht erreichbare Objekte sind weiß und müssen aufgeräumt werden.
Fügen Sie hier eine Bildbeschreibung ein

Das sieht gut aus, aber wenn die Anwendung während der Markierung ausgeführt wird, kann sich der Zeiger des Objekts ändern. In diesem Fall werden wir auf ein Problem stoßen: das Problem des Objektverlusts.

Schauen wir uns die folgende Situation an, wenn der Garbage Collector die folgende Situation scannt: Zu
Fügen Sie hier eine Bildbeschreibung ein
diesem Zeitpunkt führt die Anwendung die folgenden Vorgänge aus:

A.c = C
B.c = null

Auf diese Weise sieht das Zustandsdiagramm des Objekts wie folgt aus:
Fügen Sie hier eine Bildbeschreibung ein

Wenn der Garbage Collector zu diesem Zeitpunkt erneut markiert und scannt, sieht es so aus:
Fügen Sie hier eine Bildbeschreibung ein
Offensichtlich ist C zu diesem Zeitpunkt weiß und wird als Müll betrachtet und muss bereinigt werden. Dies ist offensichtlich unvernünftig. Wie stellen wir also sicher, dass die von GC markierten Objekte nicht verloren gehen, wenn die Anwendung ausgeführt wird? Es gibt zwei Möglichkeiten:
1. Zeichnen Sie das Objekt beim Einfügen auf.
2. Zeichnen Sie das Objekt auf, wenn es gelöscht wird.

Zufällig entspricht dies zwei unterschiedlichen Implementierungen von CMS und G1:

Im CMS wird die inkrementelle Aktualisierung verwendet. Solange festgestellt wird, dass ein Verweis auf ein weißes Objekt einem Feld eines schwarzen Objekts in der Schreibsperre (Write Barrier) zugeordnet ist, wird das weiße Objekt grau angezeigt. Das heißt, wenn es eingefügt wird, wird es aufgezeichnet.

In G1 wird die STAB-Methode (Snapshot-at-the-Beginning) verwendet, um alle Objekte beim Löschen aufzuzeichnen. Sie besteht aus 3 Schritten:

1. Erstellen Sie einen Snapshot, um überlebende Objekte zu Beginn der Markierung zu markieren.
2. Stellen Sie alle geänderten Objekte zum Zeitpunkt der gleichzeitigen Markierung in die Warteschlange (in der Schreibbarriere werden alle Objekte, auf die alte Referenzen verweisen, nicht weiß).

3. Es kann sein, dass es kostenlosen Müll gibt, der beim nächsten Mal abgeholt wird

Auf diese Weise kann G1 nun erkennen, welche alten Partitionen den meisten wiederverwertbaren Müll enthalten. Wenn die globale gleichzeitige Markierung abgeschlossen ist, wird an einem bestimmten Punkt Mix GC gestartet. Diese Garbage Collections werden als „Hybrid“ bezeichnet, da sie nicht nur die normale Garbage Collection der jungen Generation durchführen, sondern auch einige Partitionen zurückgewinnen, die vom Hintergrund-Scan-Thread markiert wurden. Die Hybrid-Garbage-Collection sieht wie in der folgenden Abbildung dargestellt aus:
Fügen Sie hier eine Bildbeschreibung ein
Der Hybrid-GC wendet auch eine Kopierbereinigungsstrategie an. Wenn der GC abgeschlossen ist, wird der Speicherplatz wieder freigegeben.
Fügen Sie hier eine Bildbeschreibung ein
An diesem Punkt ist die Hybrid-GC zu Ende. Im nächsten Abschnitt werden wir über den Einstieg in die Tuning-Praxis sprechen.

</

Ich denke du magst

Origin blog.csdn.net/toto1297488504/article/details/132435745
Empfohlen
Rangfolge