Heim  >  Artikel  >  Java  >  JVM-Garbage-Collection-Algorithmus

JVM-Garbage-Collection-Algorithmus

大家讲道理
大家讲道理Original
2017-08-19 13:52:391546Durchsuche

Wir alle wissen, dass der größte Unterschied zwischen der Java-Sprache und der C-Sprache das automatische Speicherrecycling ist. In diesem Artikel werden verschiedene Algorithmen der JVM-Speicherbereinigung vorgestellt, um die Grundlagen des Speicherrecyclings zu verstehen. Prinzip.

Stopp die Welt

Bevor wir den Garbage-Collection-Algorithmus einführen, müssen wir zunächst das Wort „Stopp die Welt“ verstehen, die Welt stoppen Tritt auf, wenn ein bestimmter Garbage Collection-Algorithmus ausgeführt wird. Um die Garbage Collection durchzuführen, führt die JVM vorübergehend die Java-Anwendung aus und wartet, bis die Garbage Collection abgeschlossen ist, bevor sie mit der Ausführung fortfährt. Wenn Sie JMeter zum Testen eines Java-Programms verwendet haben, stellen Sie möglicherweise fest, dass das Java-Programm während des Tests unregelmäßige Pausen aufweist. Tatsächlich führt die JVM eine Speicherbereinigung durch. Daher ist es unser Hauptziel bei der Optimierung der JVM, die Zeit bis zum Stillstand der Welt so weit wie möglich zu verkürzen. Schauen wir uns als Nächstes an, welche gängigen Garbage-Collection-Algorithmen derzeit verfügbar sind.

Referenzzählmethode

Die Referenzzählmethode zählt, wie der Name schon sagt, die Anzahl der Referenzen auf ein Objekt erhöht wird, wird die Referenzzählmethode um 1 erhöht. Durch Dekrementieren des Referenzzählers um eins wird dieser um 1 verringert.

JVM-Garbage-Collection-Algorithmus

Die obige Abbildung zeigt, dass drei Teacher-Referenzen auf das Teacher-Objekt im Heap verweisen Das Teacher-Objekt ist 3 usw., der Referenzzähler des Student-Objekts ist 2.

JVM-Garbage-Collection-Algorithmus

Die obige Abbildung zeigt die Referenz des Teacher-Objekts wird auf 2 reduziert. Die Referenz des Student-Objekts wird auf 0 reduziert (der Grund für die Reduzierung ist, dass die Referenz auf Null zeigt, z. B. teacher3=null. Gemäß dem Referenzzählalgorithmus ist der Speicherplatz des Student-Objekts). wird zurückgefordert.

Das Prinzip des Referenzzählalgorithmus ist sehr einfach und der primitivste Recycling-Algorithmus. Dieser Algorithmus wird jedoch aus zwei Gründen nicht verwendet. 1. Häufiges Zählen beeinträchtigt die Leistung. und 2. Probleme mit Zirkelverweisen können nicht behandelt werden.

Zum Beispiel referenziert das Teacher-Objekt das Student-Objekt und das Student-Objekt referenziert das Teacher-Objekt. In diesem Fall wird das Objekt niemals recycelt.

Markieren und löschen

Markierungs- und Löschalgorithmus, der die Grundlage vieler Garbage-Collection-Algorithmen bildet. Einfach ausgedrückt gibt es zwei Schritte: markieren und löschen.

Markieren: Alle GC-Roots durchqueren und von GC-Roots aus erreichbare Objekte als Live-Objekte festlegen

Löschen: Den Heap durchqueren Alle Objekte in , Objekte, die nicht als erreichbar markiert sind, werden gelöscht.

JVM-Garbage-Collection-Algorithmus

Achten Sie auf die grauen Objekte im obigen Bild, denn Sie können nicht vom GC-Stamm aus durchlaufen werden (obwohl sie selbst eine Referenzbeziehung haben, können sie nicht vom GC-Stamm aus durchlaufen werden), daher werden sie nicht als lebendige Objekte markiert und werden während des Bereinigungsprozesses recycelt.

Hier muss beachtet werden, dass während der Ausführung des Markierungslöschalgorithmus ein „Stopp der Welt“ auftritt, sodass das Java-Programm anhalten und warten kann, um sicherzustellen, dass dies der Fall ist Während des Markierungslöschvorgangs werden keine neuen Einträge generiert. Warum muss das Java-Programm angehalten werden? Wenn beispielsweise nach Abschluss des Markierungsprozesses ein neues Objekt generiert wird und das Objekt den Markierungszeitraum verpasst hat, wird das neu generierte Objekt im anschließenden Bereinigungsprozess als nicht markiert betrachtet, da es nicht markiert wurde Wenn ein nicht erreichbares Objekt gelöscht wird, tritt im Programm ein Fehler auf. Daher wird das Java-Programm angehalten, wenn der Markierungslöschalgorithmus ausgeführt wird, was zu „Stop the World“ führt.

Als nächstes fassen wir den Markierungs- und Löschalgorithmus zusammen:

1 Da es viel Speicherdurchlaufarbeit erfordert, ist die Ausführungsleistung gering . Dies führt auch zu einer längeren „Stopp-die-Welt“-Zeit und einem verringerten Java-Programmdurchsatz

2. Wir haben festgestellt, dass nach dem Löschen des Objekts ein leeres Objekt zurückbleibt Platz im Speicher, was zu Speicherunterbrechungen und Platzverschwendung führt.

Als nächstes wollen wir sehen, ob andere Algorithmen diese Probleme verbessern können?

Tag-Komprimierung

Vielleicht haben Sie an den Markierungskomprimierungsalgorithmus gedacht. Er basiert auf dem Markierungsentfernungsalgorithmus und fügt einen Komprimierungsprozess hinzu.

JVM-Garbage-Collection-Algorithmus

Nachdem die Markierungslöschung abgeschlossen ist, wird der Speicherplatz komprimiert, um Speicherplatz zu sparen und das Problem der Markierungslöschung zu lösen Algorithmusspeicher.

Beachten Sie, dass der Markierungskomprimierungsalgorithmus auch „Stop the World“ erzeugt und nicht gleichzeitig mit dem Java-Programm ausgeführt werden kann. Während des Komprimierungsprozesses ändern sich die Speicheradressen einiger Objekte, und das Java-Programm kann nur warten, bis die Komprimierung abgeschlossen ist, bevor es fortfährt.

Kopieralgorithmus

Der Kopieralgorithmus teilt den Speicher einfach in zwei Teile, verwendet jedoch nur einen davon während der Speicherbereinigung, den Überlebende Objekte im verwendeten Speicher werden in einen anderen leeren Speicher verschoben und schließlich die Objekte im verwendeten Speicher gelöscht, um die Speicherbereinigung abzuschließen.

JVM-Garbage-Collection-Algorithmus

JVM-Garbage-Collection-Algorithmus

JVM-Garbage-Collection-Algorithmus

JVM-Garbage-Collection-Algorithmus

Relatives Tag des Algorithmus kopieren Der Komprimierungsalgorithmus ist prägnanter und effizienter, aber seine Mängel sind auch offensichtlich. Er eignet sich nicht für Situationen, in denen viele überlebende Objekte vorhanden sind, und die Kopierleistung ist daher schlecht Der Kopieralgorithmus wird in der neuen Generation häufig im Speicherbereich verwendet, da in der neuen Generation weniger überlebende Objekte vorhanden sind und die Kopierkosten geringer sind. Ein weiterer Nachteil sind die hohen Kosten für die Speicherplatzbelegung, da Objekte basierend auf zwei Speicherplätzen kopiert werden und während des Nicht-Garbage-Collection-Zyklus nur ein Speicherplatz verwendet wird, was zu einer geringen Speicherauslastung führt.

Zusammenfassung

Oben haben wir gängige Garbage-Collection-Algorithmen vorgestellt. Jeder dieser Algorithmen hat seine eigenen Vor- und Nachteile, aber das sind sie nicht Das Gleiche gilt in der JVM, anstatt einfach einen bestimmten Algorithmus zu verwenden. Der Garbage Collector kann als eine andere Kombination einer Reihe von Algorithmen angesehen werden doppeltes Ergebnis mit halbem Aufwand. In unserem nächsten Artikel stellen wir den Garbage Collector vor.

Referenzmaterialien:

"Praktische Java Virtual Machine" Ge Yiming

"Vertiefendes Verständnis von Java Virtual Machine" Machine (2. Auflage)》Zhou Zhiming

Das obige ist der detaillierte Inhalt vonJVM-Garbage-Collection-Algorithmus. 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
Vorheriger Artikel:Java liest ExcelNächster Artikel:Java liest Excel