Heim  >  Artikel  >  Java  >  Hotspot – Garbage Collector (JVM) im Detail erklärt

Hotspot – Garbage Collector (JVM) im Detail erklärt

巴扎黑
巴扎黑Original
2017-07-17 11:51:082023Durchsuche

In den ersten beiden Artikeln „Einführung in JVM – Runtime Data Area“ und „Gemeinsame JVM-Garbage-Collection-Algorithmen“ wurden tatsächlich JVM Spezifikationen und häufig verwendete Garbage-Collection-Algorithmen erwähnt, insbesondereJVM Es gibt tatsächlich mehr als eine Implementierung, es gibt natürlich JRockit, J9 Das bekannteste davon ist HotSpot JVM. Das Folgende ist das Gesamtarchitekturdiagramm von HotSpot JVM. Dieser Artikel konzentriert sich auf den Garbage Collector (Müll in HotSpotSammler).

Die vorhandenen

HotSpot Garbage Collectors und ihre Beziehungen und Anwendungsbereiche sind wie folgt dargestellt:

Unter ihnen liegt

G1 GC sehr auffällig zwischen der neuen und der alten Generation. Man kann davon ausgehen, dass dieser G1 GC sowohl in der neuen als auch in der alten Generation verwendet werden kann. Man kann tatsächlich sagen, dass G1 ist ein epochales neues KonzeptGC.

Bevor wir den oben genannten Garbage Collector vorstellen, müssen wir zunächst den

Client-Modus und JVM-Maschine erläutern >Server Modus, was Java tun kann, ist, ein Client zu sein. Einfach ausgedrückt ist es eine GUI Desktop-Anwendung, kann zweitens serverseitig verwendet werden. Zwei Modi: Client-Modus startet schnell und weist nach dem Start eine schlechte Leistung auf; Server-Modus startet langsam und bietet nach dem Start eine höhere Leistung.

Serielle GC(-XX:+UseSerialGC, Kopieralgorithmus, neue Generation) Dies ist ein älterer Garbage Collector, ich verstehe ihn als

"

Einfach und grob ", einfache und grobe Methoden können oft mit einfachen Umgebungen umgehen. Tatsächlich Serielle GC Genau das im Client-Modus. Es handelt sich um einen seriellen Garbage Collector. Das bedeutet, dass selbst ein Multi-Core-Prozessor nicht mehrere Threads gleichzeitig sammeln muss. Während er seriell ist, müssen auch andere normale Arbeitsthreads aufhören zu arbeiten, was als „Stop the“ bezeichnet wird Welt“. Das ist eigentlich leicht zu verstehen. Wenn man den Müll aufräumt, möchte man nicht, dass jemand gleichzeitig den Müll wegwirft. Natürlich ist Serial GC im heutigen HotSpot JVMServer-Modus fast dasselbe Verlassen. Darüber hinaus funktioniert es mit dem gesammelten Müll "Kopieralgorithmus " funktioniert in Java Die neue Generation des Heaps.

ParNew GC(-XX:+Verwenden ParNewGC, Kopieralgorithmus, Neue Generation)

 ParNew GC ist eigentlich eine Multithread-Version von Serial GC. Wie oben erwähnt, ist Serial GCselbst in einer Multi-Core-CPU-Umgebung ein einzelner Thread für das Garbage-Memory-Recycling. Diese Garbage-Collector-Seite kann den Garbage-Speicher in einer Multithread-Umgebung recyceln. Dieser Multithread ist nur eine Multithread-Garbage-Collection und wird nicht gleichzeitig mit Benutzer-Threads ausgeführt. Und nur es kann mit dem CMS Garbage Collector der alten Generation verwendet werden, und CMS ist genau der epochale Garbage Collector. Wenn also der Garbage Collector der alten Generation von JVM CMS ist, ist der Garbage Collector der neuen Generation normalerweise ParNew GC.

Parallel GC (-XX:+UseParallelGC, Replikationsalgorithmus, neue Generation)

Es ähnelt in gewisser Weise ParaNew GC Dem Namen nach zu urteilen, handelt es sich auch um einen parallelen Multithread-Kollektor. Wir haben bereits erwähnt, dass wir während des GC-Prozesses „die Welt stoppen“ müssen. Je kürzer die Pausenzeit, desto besser . Viele Garbage Collectors (einschließlich der ersten beiden) konzentrieren sich darauf, wie die Pausenzeit verbessert werden kann. Und Parallel GC konzentriert sich auf den Durchsatz. Es konzentriert sich auf den Gesamtzeitaufwand der Garbage Collection. Wenn der Gesamtzeitaufwand der Garbage Collection kürzer ist, ist der Durchsatz hoch und die CPU kann mehr Zeit dafür aufwenden . In Bezug auf die Aufgabenausführung: , (Durchsatz Aufgabenlaufzeit / (Aufgabenlaufzeit + Müllabfuhrzeit)) .

Serial Old GC (-XX:+UseSerialOldGC, Tags -Komprimierungsalgorithmus, alte Generation)

Es ist die Version der alten Generation von

Serial GC Es ist auch Single-Threaded und kann auch kann mit Parallel GC verwendet werden und wird in Verbindung mit der alten Generation GC verwendet.

Parallel Old GC(-XX:+UseParallelOldGC, gekennzeichnet mit - Komprimierungsalgorithmus, alte Generation)

Um das Dilemma zu vermeiden, in der neuen Generation Parallel GC zu wählen und in der alten Generation nur Serial Old GC zu wählen, erschien >Die alte Version von Parallel GC——Parallel Old GC. Wenn Sie daher die Kombination von Parallel GC und Parallel Old GC für einige Konstanten verwenden, die einen hohen Durchsatz erfordern, ist dies ein gute Wahl.

☆Concurrent Mark Sweep(CMS) GC (-XX:+UseConcMarkSweepGC, markieren-Klarer Algorithmus, alte Generation)

CMS GC belegt fast JVM Die epochale Bedeutung des Garbage Collectors der alten Generation besteht darin, dass der Garbage Collection-Thread fast gleichzeitig mit dem Benutzer-Thread arbeiten kann. "Fast"Weil es immer noch nicht völlig unnötig geht"Stoppt die Welt", aber es verkürzt die Pausenzeit so weit wie möglich.

Der gesamte Garbage-Collection-Prozess kann in die folgenden 4Schritte unterteilt werden:

  1. Erstmarkierung

  2. Gleichzeitiges Markieren

  3. Bemerkung

  4. Gleichzeitige Bereinigung

 Diese4 Schritte"Anfangs-Tag" und " Bemerkung"Benötigt eine kurze Zeit von "Stoppt die Welt", der Prozess der gleichzeitigen Markierung ist tatsächlich Das Obige dient dazu, gleichzeitig mit dem Benutzer-Thread zu arbeiten, d. h. "Müll wegwerfen und gleichzeitig reinigen" Dies führt zu einem Problem. Wenn nach dem Markieren Müll entsteht, muss der Müll bis zum nächsten Mal auf die Wiederverwertung warten. Natürlich kommt es nach Abschluss der Markierung nicht zu Konflikten zwischen dem Müll und dem Benutzerthread, und der Bereinigungsprozess kann gleichzeitig mit dem Benutzerthread verarbeitet werden. Eines der offensichtlicheren und unvermeidbaren Probleme dieses Garbage Collectors besteht darin, dass er die Markierung "-Clear Algorithmus, das heißt, er komprimiert die überlebenden Objekte unterschiedlich, was zu dem Problem der Speicherplatzfragmentierung führt. Wenn ein kontinuierlicher großer Speicherplatz zugewiesen werden muss, dann Vollständige GC kann nur einmal ausgelöst werden. Im vorherigen Artikel „Common Garbage Collection Algorithms for JVM“ wurde erwähnt, dass die Garbage Collection der neuen Generation „Minor GC“ und die Garbage Collection der alten Generation „Minor GC“ heißt 🎜> „Major GC“ und „Full GC“ löst eine Garbage Collection auf dem gesamten Heap aus. Es ist denkbar, dass die Kosten anfallen ziemlich hoch, und Zu diesem Zeitpunkt muss der Benutzer-Thread angehalten werden und kann nur durch Anpassen der Parameter von CMS GC entsprechend bestimmten Nutzungsszenarien angepasst und optimiert werden.

Garbage-First(G1) GC (-XX:+UseG1GC)

G1 GC unterscheidet sich von allen vorherigen Garbage Collectors. Wie aus dem zweiten Bild zu Beginn ersichtlich ist, deckt es die neue Generation und die alte Generation ab, oder es ist einfach logisch Keep "Neue Generation" und "Alte Generation"Diese Aussage existiert tatsächlich nicht in der Speichergenerierung. Es handelt sich nur um eine experimentelle Version in JDK6 Ich werde diesen Garbage Collector erst später separat erläutern. Außerdem lautet die Papieradresse: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.63 .6386&rep=rep1&type=pdf.

Das obige ist der detaillierte Inhalt vonHotspot – Garbage Collector (JVM) im Detail erklärt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn