[JAVA] G1 Müllabfuhr in 3 Minuten

Java Adventskalender 2017 Dies ist der Artikel am 21. Tag. Java 9 wurde dieses Jahr veröffentlicht und der Standard-GC für die HotSpot-JVM ist jetzt G1. Ich werde ihn daher zur Überprüfung veröffentlichen.

GC-Typ

In HotSpot VM sind vier GC-Algorithmen implementiert.

Serieller Typ

Dies ist der Standard-GC für Single-Core-CPU-Computer. Die GC-Verarbeitung wird in einem einzelnen Thread ausgeführt. In der kleinen Speicherbereinigung und der vollständigen Speicherbereinigung werden alle Anwendungen gestoppt.

01.png

Paralleltyp (Durchsatztyp)

Dies ist der Standard-GC für Multi-Core-CPU-Maschinen. Da der GC-Prozess in mehreren Threads ausgeführt wird, wird der GC schneller als der serielle Typ ausgeführt. In Java7u4 oder früheren Versionen ist nur die Verarbeitung des jungen Bereichs Multithreading. Wenn Sie Multithreading für die Verarbeitung des alten Bereichs verwenden, müssen Sie die Option -XX: + UseParallelOldGC angeben. Seit Java7u4 ist Multithread-GC die Standardeinstellung für junge und alte Bereiche.

02.png

CMS(Concurrent Mark Sweep) Dieser GC wurde entwickelt, um langfristige Anwendungsausfälle im Zusammenhang mit der vollständigen Speicherbereinigung zu vermeiden. In der Minor Garbage Collection wird der Anwendungsthread wie im seriellen und parallelen Typ gestoppt. Die vollständige Speicherbereinigung stoppt den Anwendungsthread nicht, verwendet jedoch einen oder mehrere Threads, um den alten Bereich im Hintergrund zu durchsuchen und nicht verwendete Objekte zu verwerfen. Infolgedessen ist die Gesamtzeit, in der der Anwendungsthread gestoppt wird, kürzer als die des Durchsatztyps.

03.png

Was ist G1GC?

Heap-Management

Traditionelles (serielles, paralleles, CMS) Heap-Management

05a.png

G1-Heap-Management

Der Heap ist in Regionen unterteilt und verwaltet. 04a.png

Regionsgröße

In der Standardeinstellung wird die Regionsgröße durch die Heap-Größe bestimmt.

Wurfgröße Regionsgröße
Weniger als 4 GB 1MB
4 GB oder mehr und weniger als 8 GB 2MB
8 GB oder mehr und weniger als 16 GB 4MB
16 GB oder mehr und weniger als 32 GB 8MB
32 GB oder mehr und weniger als 64 GB 16MB
64 GB oder mehr 32MB

Sie können die Größe auch selbst mit dem Flag -XX: G1HeapRegionSize = N angeben. 0 ist der Standardwert. N muss eine Potenz von 2 sein, und wenn ein anderer Wert angegeben wird, wird er auf die nächste Potenz von 2 abgerundet.

In den meisten Fällen ist der Standardwert OK, in den folgenden Fällen ist jedoch eine Optimierung erforderlich. Wenn beispielsweise der Schwankungsbereich des Heaps groß ist (-Xms4G -Xmx16G), beträgt die Regionsgröße standardmäßig 1 MB, und wenn der Heap erweitert wird, beträgt die Anzahl der Regionen 16.000. Da G1GC unter der Annahme entworfen wurde, dass die Anzahl der Regionen etwa 2.048 beträgt, wird sich die GC-Effizienz verschlechtern. Passen Sie in einem solchen Fall die Größe so an, dass die Anzahl der Regionen etwa 2.048 beträgt, indem Sie die obige Option angeben.

G1GC-Algorithmus

In G1 werden vier Hauptprozesse ausgeführt.

GC in die junge Region

Wenn der Eden-Raum voll ist, tritt eine GC zum jungen Bereich auf. Wenn der GC abgeschlossen ist, ist der Eden-Bereich leer und die Region wird freigegeben. Mindestens ein Überlebensraum wird zugewiesen und einige Objekte werden in den alten Bereich verschoben. 06a.png

Gleichzeitiger Zyklus

Im gleichzeitigen Zyklus besteht die Hauptsache darin, den Bereich, in dem der alte Bereich nicht verwendet wird, mit einer Markierung (X in der Abbildung) zu versehen. Führen Sie vor dem Markieren eine GC für den jungen Bereich durch.

Der gleichzeitige Zyklus ist in mehrere Phasen unterteilt.

  1. Anfangsmarke
  2. Root-Region-Scan
  3. Concurrent-Mark
  4. Bemerkung
  5. Aufräumen
  6. gleichzeitige Bereinigung

Von diesen stoppen Anwendungsthreads bei 1, 4 und 5. 07a.png

Gemischte GC

Der Eden-Raum wird vollständig geleert und der Überlebensraum wird angepasst. Im alten Gebiet wird ein Teil der Region, der im gleichzeitigen Zyklus markiert ist, freigegeben. Es reduziert auch die Heap-Fragmentierung, indem Daten, die in der markierten Region verwendet werden, in eine andere Region verschoben werden. Anstatt alle markierten Regionen in einem GC freizugeben, wiederholen Sie den gemischten GC, um einen Ausfall des gleichzeitigen Modus zu vermeiden. 08a.png

Volle Müllabfuhr

Dies ist die übliche vollständige Speicherbereinigung. Eine vollständige Speicherbereinigung sollte in G1 vermieden werden. In diesem Fall müssen Sie es optimieren. Es gibt vier Hauptursachen für die vollständige Speicherbereinigung:

Wo zu verwenden

Welcher GC verwendet werden soll, sollte anhand des Leistungszielwerts und der aktuellen CPU-Auslastung berücksichtigt werden.

Web-System

――Der gleichzeitige Typ wird empfohlen, wenn Sie die Auswirkungen auf einige Anforderungen aufgrund der vollständigen Speicherbereinigung minimieren möchten.

Batch-System

Schließlich

GC ist das Herz von Java (JVM). Speicherbezogene Leistungsprobleme sind in jeder Java-Version eines Systems unvermeidbar. Ich möchte etwas über dieses neue, aber standardmäßige G1GC verstehen.

* Beachten *

Samstag, 20. Januar 2018 "JavaOne 2017 Briefing Session in OKINAWA" findet statt! ** Luxusgäste kommen! ** ** ** Bitte kommen Sie in der Nebensaison nach Okinawa. https://java-kuche.doorkeeper.jp/events/68540 https://java-kuche.doorkeeper.jp/events/68542

Recommended Posts

G1 Müllabfuhr in 3 Minuten
Müllabfuhr - Teil 1 -
Wertobjekt in 3 Minuten
Java Stream API in 5 Minuten
Deep Copy Collection in Java
Kontinuierliche Inspektion in 5 Minuten mit SonarQube
Java-Leistung Kapitel 5 Grundlagen der Garbage Collection