Technologieaustausch

[GC-Garbage-Collection-Algorithmus und Collector]

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Autor: ofLJli
Link: https://juejin.cn/post/7003213289425633287?searchId=20240709085629749958B21D886D4E67D4
Quelle: Seltene Erden-Nuggets
Das Urheberrecht liegt beim Autor. Für den kommerziellen Nachdruck wenden Sie sich bitte an den Autor, um eine Genehmigung einzuholen. Für den nichtkommerziellen Nachdruck geben Sie bitte die Quelle an.


Überblick

Die Hauptstrukturen in der JVM sind: Stapel, Heap und Methodenbereich der virtuellen Maschine. Die Größe des Stapelrahmens des virtuellen Maschinenstapels wurde vom Compiler bestimmt. Mit dem Ende der Methode oder der Thread-Technologie wird auch der Speicher des virtuellen Maschinenstapels recycelt. Der Java-Heap und der Methodenbereich weisen erhebliche Unsicherheiten auf. Die Zuweisung und Wiederverwendung dieses Teils des Speichers ist dynamisch. Der GC ist besorgt darüber, wie dieser Teil des Speichers verwaltet wird.

Dieser Artikel konzentriert sich auf die folgenden drei Dinge, die GC erreichen muss:

  • Wann recyceln? (Bedingungen, die GC auslösen)
  • Garbage-Collection-Algorithmus
  • Müllsammler

Wann recyceln?

Nach zwei Generationshypothesen:绝大多数的对象都是朝生夕死熬过越多次的GC回收的对象就越难回收 . Der Heap ist in Generationen unterteilt: Neue Generation (Eden, From, To), alte Generation und Generationsrecycling werden ebenfalls während der GC durchgeführt.

bild.png

Kleinere GC : Nicht verwendete Objekte der neuen Generation recyceln. Das Merkmal der meisten Objekte der neuen Generation ist, dass sie über Nacht leben und sterben. Auslösezeiten sind:

  • Unzureichender Platz im Eden-Bereich löst den Minor GC aus. Da der Eden-Raum in seiner Größe begrenzt ist, wird der Minor GC häufiger ausgelöst. Dies erfordert einen schnellen und effizienten Erfassungsalgorithmus, der im Allgemeinen verwendet wird.标记-复制算法Recyceln Sie diesen Bereich (wird später besprochen).

Große GC : Nicht verwendete Objekte der alten Generation recyceln.allgemeiner Gebrauch标记-清除算法oder标记-整理算法Recyceln.

Vollständige GC : Nicht verwendete Objekte im Heap- und Methodenbereich recyceln. Der Recyclingbereich für vollständige GC ist relativ groß und eine lange Ausführungszeit kann zu Verzögerungen führen. Daher sollte die Anzahl der vollständigen GC so weit wie möglich reduziert werden. Die Auslösezeitpunkte sind ungefähr wie folgt:

  • Unzureichender Speicherplatz in der alten Generation wird dadurch verursacht, dass Objekte der neuen Generation in die alte Generation gelangen, große Objekte direkt in die alte Generation gelangen usw. Wenn diese Objekte nicht im maximalen zusammenhängenden Speicherplatz der alten Generation gespeichert werden können, wird ein vollständiges GC-Recycling durchgeführt .

  • Unzureichender Speicherplatz im Methodenbereich. Im Methodenbereich werden hauptsächlich Typinformationen und Konstantenpools gespeichert. Es besteht auch die Gefahr, dass nicht genügend Speicherplatz vorhanden ist und ein vollständiges GC-Recycling durchgeführt wird.

  • System.gc() wird explizit aufgerufen und von Full GC recycelt.

Drei Garbage-Collection-Algorithmen:

1. Mark-and-Sweep-Algorithmus

Prinzip: Nutzung可达性分析算法Nicht verfügbare Objekte erstellenmarkieren, und führen Sie dann die ausKlar . Nachteile: Bei vielen Objekten ist die Markierungseffizienz gering. Nach dem Löschen des Objekts kommt es zu einer Speicherfragmentierung und der Speicher ist diskontinuierlich. Zweck: Einige Sammler verwenden diesen Algorithmus in der Sammlung alter Generationen

2. Mark-Copy-Algorithmus

Prinzip: Teilen Sie den Speicherplatz in zwei Teile, die Hälfte wird für die Objektspeicherung verwendet und die andere Hälfte ist frei.Wenn der Bereich, in dem Gegenstände gelagert werden, voll ist, verwenden Sie可达性分析算法Lebewesen bewegenmarkierenKomm raus und dannKopieren Gehen Sie zu einem anderen leeren Bereich und räumen Sie alle vorherigen Bereiche in leere zusammenhängende Bereiche um. Nachteil: Wenn es viele überlebende Objekte gibt, ist eine große Menge an Speicherkopien und -entwicklung erforderlich. Der Speicherplatz kann nur die Hälfte der Vorteile nutzen und Ressourcen verschwenden. Funktion: Dieser Recycling-Algorithmus wird im Allgemeinen für Objekte verwendet, die in der neuen Generation leben und sterben. Allerdings wurde der Replikationsalgorithmus in der neuen Generation optimiert, dieser Algorithmus fügt jedoch einen Zuweisungsgarantiemechanismus hinzu, um zu verhindern, dass zu viele überlebende Objekte zugewiesen werden. Es wird ein Recycling-Algorithmus im Appel-Stil verwendet:

bild.png

3. Markierungs- und Kollationsalgorithmus

Prinzip: Es erfolgt die Markierung标记-清除算法Das Gleiche also整理存Live-Objekte bewegen sich zu einem Ende und dann alle Objekte außerhalb der Live-Grenze清除 . Nachteile: Das Bewegen von Gegenständen birgt ein gewisses Risiko. Zu viele Objekte sind ineffizient. Hauptsächlich im Alter.

bild.png

Müllsammler

Der von GC verwendete Garbage Collector wird für das Recycling verwendet. Mit der kontinuierlichen Entwicklung gibt es immer mehr Garbage Collectors. Hier werden die herkömmlichen Garbage Collectors in drei Kategorien unterteilt: Single-Thread-Collector, Multi-Thread-Collector und Concurrent Sammlung.

Single-Threaded-Kollektor

Die Kombinationen von Single-Threaded-Kollektoren sind: Seriell/Serial Old-Kollektor. Sie verwenden nicht nur einen Sammlungsthread, um den Sammlungsvorgang abzuschließen, sondern während der Sammlungsthread arbeitet, muss der Benutzerthread aufhören, zu warten, bis die Sammlung abgeschlossen ist. Das Bild zeigt das schematische Diagramm des Serial/Serial Old-Kollektors:

bild.png Wenn die Speicherressourcen des Clients begrenzt sind, die Anzahl der Prozessorkerne gering ist oder es sich um einen Single-Core-Prozessor handelt, kann der Collector aufgrund seiner Einfachheit und Effizienz seine Arbeit so schnell wie möglich abschließen.

Multithread-Parallelkollektor

Zu den Multithread-Kollektoren gehören: ParNew, Parallel Scavenge und Parallel Old, wobei Parallel Scavenge/Parallel Old ein kombinierter Kollektor ist. Diese Multithread-Kollektoren fügen nur Garbage-Collection-Threads hinzu, und Benutzer-Threads warten immer noch nicht mehr auf Garbage Collection.

bild.png

parNew Collector: Es handelt sich tatsächlich um eine Multithread-Version von Serial. Es kann derzeit mit dem Serial Collector und dem CMS Collector zusammenarbeiten.

Parallel Scavenge Collector: Wird im Allgemeinen in Verbindung mit dem Parallel Old Collector verwendet.Im Vergleich zum ParNew-Kollektor wird mehr Aufmerksamkeit geschenkt吞吐量Kontrolle, der Durchsatz istDie Ausführungszeit des Benutzerthreads macht die gesamte CPU-Laufzeit aus, der Durchsatz ist natürlich umso größer, desto besser.

Multithreading verwendet im Allgemeinen den Server, da die Ausführung von Multithreading die Zeit erfordert, die Zeitscheibenrotation verbraucht. Wenn es sich um einen einzelnen Prozessor handelt, ist die Verarbeitungseffizienz zweifellos langsamer. Dies ist jedoch sehr ressourcenschonend, und die Serverseite der Analyseberechnungen, die nicht mit dem Benutzer interagieren muss, kann die Ausführungseffizienz erhöhen.

gleichzeitiger Kollektor

Zu den gleichzeitigen Collectors gehören: CMS Collector, ein Collector, der darauf abzielt, die Systempausenzeit so kurz wie möglich zu halten und eine bessere Benutzererfahrung zu bieten. Sein Sammlungsthread kann gleichzeitig mit dem Benutzerthread ausgeführt werden. CMS hat drei标记(Anfangsnote, Parallelnote, Bemerkung) und einmal清理(Gleichzeitige Bereinigung): Zwei der drei Markierungen erfordern das Anhalten des kürzeren Benutzerthreads, eine längere Markierung, die gleichzeitig mit dem Benutzerthread erfolgt, und die Löschung, die gleichzeitig mit dem Benutzerthread erfolgt.

bild.png

Anfangsnote: Markieren Sie das erste mit GC Roots verknüpfte Objekt. Die Zeit ist sehr kurz gleichzeitige Markierung: Führen Sie die Referenzkette von GC Roots (Erreichbarkeitsanalysealgorithmus) gleichzeitig mit dem Benutzerthread aus, was lange dauert umbenennen : Durchsuchen Sie die neue Referenzkette erneut, die vom Benutzerthread während der gleichzeitigen Markierungsphase generiert wurde. Etwas länger als die ursprüngliche Markierung.Gleichzeitig klar:verwenden标记-清除算法Räumen Sie nutzlose Gegenstände weg.

Drei Hauptnachteile: 1: CPU-Empfindlichkeit, Parallelität kann den Betrieb von Benutzer-Threads auf Prozessoren mit einer geringen Anzahl von Kernen beeinträchtigen. 2: Schwebender Müll: Der während der gleichzeitigen Bereinigungsphase erzeugte Müll kann nur auf die nächste GC-Sammlung warten. Drittens: Speicherfragmentierung, Markierungsreinigung. Puja-Produkte verfügen über eine große Menge an diskontinuierlichem Speicherplatz.

Zusammenfassung

Dieser Artikel beginnt mit那些内存需要回收什么时候回收如何回收Als Implementierung werden zwei Algorithmen zur Objektüberlebensbeurteilung, Bedingungen für das Klassenbereichsrecycling, Generationsmechanismus und Sammelzeitpunkt des Recyclings, drei Sammelalgorithmen und häufig verwendete Garbage Collectors geschrieben.