Heim  >  Artikel  >  Java  >  Java-GC-Algorithmus-Garbage Collector

Java-GC-Algorithmus-Garbage Collector

高洛峰
高洛峰Original
2016-11-22 13:29:281114Durchsuche

GC-Algorithmus Garbage Collector

Übersicht

Garbage Collection Garbage Collection wird 1960 in der Lisp-Sprache des MIT geboren. Nach mehr als einem halben Jahrhundert ist es so derzeit schon sehr ausgereift.

In JVM werden der Programmzähler, der Stapel der virtuellen Maschine und der Stapel der lokalen Methode alle mit dem Thread erstellt und zerstört. Der Stapelrahmen wird verschoben und gelöscht, wenn die Methode eintritt und endet, wodurch eine automatische Speicherbereinigung realisiert wird , unsere Speicherbereinigung konzentriert sich hauptsächlich auf den Java-Heap- und Methodenbereich. Während der Ausführung des Programms erfolgt die Zuordnung und Verwendung dieses Teils des Speichers dynamisch

Es gibt im Allgemeinen zwei Möglichkeiten, zu beurteilen, ob ein Objekt aktiv ist:

Referenzzählung: Jedes Objekt verfügt über ein Referenzanzahlattribut. Wenn eine Referenz hinzugefügt wird, wird die Anzahl um 1 erhöht Wenn eine Referenz freigegeben wird, wird sie um 1 gezählt und kann wiederverwendet werden, wenn die Zählung 0 erreicht. Diese Methode ist einfach und kann das Problem, dass Objekte zirkulär aufeinander verweisen, nicht lösen.

Erreichbarkeitsanalyse: Suchen Sie von den GC-Wurzeln abwärts, und der von der Suche zurückgelegte Pfad wird als Referenzkette bezeichnet. Wenn für ein Objekt keine mit GC Roots verbundene Referenzkette vorhanden ist, beweist dies, dass das Objekt nicht verfügbar ist. Nicht erreichbares Objekt.

In der Java-Sprache umfassen GC Roots:

Objekte, auf die im Stapel der virtuellen Maschine verwiesen wird.

Das Objekt, auf das von der statischen Attributentität der Klasse im Methodenbereich verwiesen wird.

Das Objekt, auf das die Konstante im Methodenbereich verweist.

Objekt, auf das JNI im lokalen Methodenstapel verweist.

Garbage-Collection-Algorithmus

Mark-Sweep-Algorithmus

Der „Mark-Sweep“-Algorithmus ist, wie der Name schon sagt, in zwei Phasen unterteilt : „Markieren“ und „Löschen“: Markieren Sie zunächst alle Objekte, die recycelt werden müssen. Nach Abschluss der Markierung werden alle markierten Objekte einheitlich recycelt. Der Grund, warum es sich um den grundlegendsten Erfassungsalgorithmus handelt, liegt darin, dass nachfolgende Erfassungsalgorithmen auf dieser Idee basieren und deren Mängel verbessern.

Es gibt zwei Hauptnachteile: Zum einen sind die Markierungs- und Löschprozesse nicht sehr effizient, zum anderen wird nach dem Markieren und Löschen eine große Anzahl diskontinuierlicher Speicherfragmente erzeugt , und die Speicherplatzfragmentierung ist zu groß. Dies kann dazu führen, dass das Programm nicht in der Lage ist, genügend zusammenhängenden Speicher zu finden, wenn es in Zukunft größere Objekte zuweisen muss und im Voraus eine weitere Speicherbereinigungsaktion auslösen muss.

Kopieralgorithmus

Java-GC-Algorithmus-Garbage CollectorKopieren (Kopieren) Sammelalgorithmus, der den verfügbaren Speicher je nach Kapazität in zwei Blöcke gleicher Größe aufteilt, jeweils nur einen verwenden dieser Stücke. Wenn dieser Speicherblock erschöpft ist, kopieren Sie die verbleibenden Objekte in einen anderen Block und bereinigen Sie dann sofort den verwendeten Speicherplatz.

Auf diese Weise wird jedes Mal ein Teil des Speichers recycelt, ohne dass komplexe Situationen wie die Speicherfragmentierung berücksichtigt werden müssen. Bewegen Sie einfach den oberen Zeiger des Heaps und weisen Sie den Speicher der Reihe nach zu. Es ist einfach zu implementieren und läuft effizient. Die Kosten dieses Algorithmus bestehen lediglich darin, dass der Speicher auf die Hälfte seiner ursprünglichen Größe reduziert wird, und das kontinuierliche Kopieren langlebiger Objekte führt zu einer verringerten Effizienz.

Markierungskomprimierungsalgorithmus

Der Kopiersammlungsalgorithmus führt mehr Kopiervorgänge aus, wenn die Objektüberlebensrate hoch ist, und die Effizienz wird geringer. Noch wichtiger: Wenn Sie nicht 50 % des Speicherplatzes verschwenden möchten, müssen Sie über zusätzlichen Speicherplatz verfügen, um die extreme Situation zu bewältigen, in der alle Objekte im verwendeten Speicher zu 100 % aktiv sind. Daher ist diese Art der Zuweisung erforderlich kann nicht direkt im Algorithmus der alten Generation verwendet werden.

Entsprechend den Merkmalen der alten Generation hat jemand einen anderen „Mark-Compact“-Algorithmus vorgeschlagen. Der Markierungsprozess ist immer noch der gleiche wie beim „Mark-Compact“-Algorithmus, die nachfolgenden Schritte stehen jedoch nicht in direktem Zusammenhang zu den Wertstoffen. Objekte werden bereinigt, aber alle überlebenden Objekte werden an ein Ende verschoben, und dann wird der Speicher außerhalb der Endgrenze direkt bereinigt

Java-GC-Algorithmus-Garbage Collector

Generationssammelalgorithmus

Die Grundannahme der GC-Generierung: Der Lebenszyklus der meisten Objekte ist sehr kurz und ihre Überlebenszeit ist kurz.

Der Algorithmus „Generational Collection“ unterteilt den Java-Heap in die neue und die alte Generation, sodass entsprechend den Merkmalen jeder Generation der am besten geeignete Erfassungsalgorithmus verwendet werden kann. In der neuen Generation wird jedes Mal, wenn eine Speicherbereinigung durchgeführt wird, festgestellt, dass eine große Anzahl von Objekten gestorben ist und nur wenige überleben. Anschließend wird ein Kopieralgorithmus verwendet, und die Sammlung kann nur durch Bezahlen der Kopierkosten abgeschlossen werden eine kleine Anzahl überlebender Objekte. Da in der alten Generation die Objektüberlebensrate hoch ist und kein zusätzlicher Platz vorhanden ist, um ihre Zuweisung zu gewährleisten, muss für das Recycling der „Mark-Clean“- oder „Mark-Clean“-Algorithmus verwendet werden.

Garbage Collector

Wenn der Sammelalgorithmus die Methodik des Speicherrecyclings ist, ist der Garbage Collector die spezifische Implementierung des Speicherrecyclings

Serial Collector

Der Serial Collector ist der älteste, stabilste und effizienteste Collector. Er kann lange Pausen verursachen und verwendet nur einen Thread zum Sammeln. Die neue Generation und die alte Generation verwenden den Kopieralgorithmus der neuen Generation, die Markierungskomprimierung der alten Generation wird während der Speicherbereinigung gestoppt

Parametersteuerung: -XX: UseSerialGC Serial Collection Collector

Java-GC-Algorithmus-Garbage Collector

ParNew Collector

ParNew Collector ist eigentlich eine Multithread-Version des Serial Collector. Parallel der neuen Generation, seriell der alten Generation; Kopieralgorithmus der neuen Generation, Markierungskomprimierung der alten Generation

Parametersteuerung: -XX: UseParNewGC ParNew Collector

-XX:ParallelGCThreads Begrenzen Sie die Anzahl der Threads

Java-GC-Algorithmus-Garbage Collector

Parallel-Kollektor

Der Parallel-Scavenge-Kollektor ähnelt dem ParNew-Kollektor, und der Parallel-Kollektor achtet stärker auf den Durchsatz des Systems. Die adaptive Anpassungsstrategie kann über Parameter aktiviert werden. Die virtuelle Maschine sammelt Leistungsüberwachungsinformationen basierend auf den aktuellen Betriebsbedingungen des Systems und passt diese Parameter dynamisch an, um die am besten geeignete Pausenzeit oder den maximalen Durchsatz bereitzustellen gesteuert durch Parameter, um die Anzahl der Millisekunden oder das Verhältnis nicht zu überschreiten; Kopieralgorithmus der neuen Generation, Markierungskomprimierung der alten Generation

Parametersteuerung: -XX: UseParallelGC Parallelkollektor verwenden, seriell der alten Generation

Parallel Old Collector

Parallel Old ist die Version der alten Generation des Parallel Scavenge Collectors, die Multithreading und „Mark-Sort“-Algorithmus verwendet. Dieser Kollektor hat erst begonnen,

Parametersteuerung in JDK 1.6 bereitzustellen: -XX: UseParallelOldGC Parallelkollektor der alten Generation parallel verwenden

CMS-Kollektor

CMS ( Der Concurrent Mark Sweep-Kollektor ist ein Kollektor, der darauf abzielt, die kürzeste Recycling-Pausezeit zu erreichen. Derzeit konzentriert sich ein großer Teil der Java-Anwendungen auf den Servern von Internet-Websites oder B/S-Systemen. Solche Anwendungen legen besonderen Wert auf die Reaktionsgeschwindigkeit des Dienstes und hoffen, dass die Systempausenzeit für Benutzer so kurz wie möglich ist eine bessere Erfahrung.

Aus dem Namen (einschließlich „Mark Sweep“) geht hervor, dass der CMS-Kollektor auf dem „Mark-Sweep“-Algorithmus basiert und sein Betriebsprozess komplizierter ist als bei den vorherigen Kollektoren. Der gesamte Prozess ist in 4 Schritte unterteilt, darunter:

Anfangsmarkierung (CMS-Anfangsmarkierung)

Gleichzeitige Markierung (CMS-Parallelmarkierung)

Bemerkung (CMS-Bemerkung)

CMS-Concurrent-Sweep

Die beiden Schritte der Erstmarkierung und Neumarkierung erfordern weiterhin „Stop The World“. Die anfängliche Markierung markiert nur die Objekte, mit denen GC Roots direkt in Verbindung gebracht werden kann, und ist sehr schnell. Die gleichzeitige Markierungsphase ist der Prozess der GC Roots-Ablaufverfolgung, und die Neumarkierungsphase dient der Korrektur der Markierung, die durch die Fortsetzung des Benutzerprogramms verursacht wird Um während der gleichzeitigen Markierungsphase zu arbeiten, ist die Pausenzeit in dieser Phase im Allgemeinen etwas länger als die anfängliche Markierungsphase, aber viel kürzer als die gleichzeitige Markierungszeit.
Da der Kollektor-Thread während der längsten gleichzeitigen Markierungs- und Löschprozesse im gesamten Prozess zusammenarbeiten kann, erfolgt der Speicherrecyclingprozess des CMS-Kollektors im Allgemeinen gleichzeitig mit der Benutzer-Thread-Implementierung. Kollektor der alten Generation (ParNew wird in der neuen Generation verwendet)

Vorteile: gleichzeitige Sammlung, geringe Pausen

Nachteile: Es werden viele Raumfragmente generiert, die gleichzeitige Phase verringert den Durchsatz

Parametersteuerung: -XX: UseConcMarkSweepGC CMS-Kollektor verwenden

-XX: UseCMSCompactAtFullCollection Führen Sie nach der vollständigen GC eine Defragmentierung durch; der Defragmentierungsprozess ist exklusiv und führt zu einer längeren Pausenzeit

-XX: CMSFullGCsBeforeCompaction Führen Sie nach dem Festlegen mehrerer vollständiger GCs eine Defragmentierung durch

-XX:ParallelCMSThreads Legen Sie die Anzahl der CMS-Threads fest (im Allgemeinen ungefähr gleich der Anzahl der verfügbaren CPUs)

Java-GC-Algorithmus-Garbage Collector

G1 Collector

G1 ist eine der modernsten Errungenschaften der aktuellen Technologieentwicklung. Die Mission des HotSpot-Entwicklungsteams besteht darin, den in JDK1.5 veröffentlichten CMS-Collector in Zukunft zu ersetzen . Im Vergleich zum CMS-Kollektor weist der G1-Kollektor die folgenden Merkmale auf:

1 Der G1-Kollektor verwendet einen Markierungssortierungsalgorithmus und erzeugt keine Speicherplatzfragmentierung. Bei der Zuweisung großer Objekte wird der nächste GC nicht im Voraus ausgelöst, da kein zusammenhängender Speicherplatz gefunden werden kann.

2. Vorhersehbare Pausen, ein weiterer großer Vorteil von G1. Die Reduzierung der Pausenzeit ist ein gemeinsamer Schwerpunkt von G1 und CMS. G1 kann jedoch auch ein vorhersehbares Pausenzeitmodell einrichten. , wodurch der Benutzer explizit festlegen kann, dass innerhalb eines Zeitsegments mit einer Länge von N Millisekunden die für die Garbage Collection aufgewendete Zeit N Millisekunden nicht überschreiten darf. Dies ist fast eine Funktion des Echtzeit-Java-Garbage Collectors (RTSJ).

Der oben erwähnte Garbage Collector sammelt nur die gesamte neue oder alte Generation, aber G1 ist nicht mehr so. Bei Verwendung des G1-Kollektors unterscheidet sich das Speicherlayout des Java-Heaps stark von anderen Kollektoren. Er unterteilt den gesamten Java-Heap in mehrere unabhängige Regionen (Regionen) gleicher Größe beibehalten, aber die neue Generation und die alte Generation sind nicht mehr physisch getrennt. Sie sind beide eine Ansammlung von Teilen der Region (die möglicherweise nicht zusammenhängend sind).

Java-GC-Algorithmus-Garbage Collector

Die Sammlung der neuen Generation ähnelt der von ParNew. Wenn die Belegung der neuen Generation einen bestimmten Anteil erreicht, beginnt die Sammlung. Ähnlich wie bei CMS gibt es eine kurze Pause, wenn der G1-Kollektor Objekte der alten Generation sammelt.

Erfassungsschritte:

1. Markierungsphase, erste Anfangsmarkierung (Initial-Mark), diese Phase wird angehalten (Stop the World Event) und wird ausgelöst A normaler Mintor GC. Entsprechend dem GC-Protokoll: GC-Pause (jung) (Anfangsmarkierung)

2. Während der Ausführung des Programms wird der überlebende Bereich recycelt (überlebt in der alten Generation). muss vor dem jungen GC abgeschlossen sein.

3. Gleichzeitige Markierung: Führen Sie eine gleichzeitige Markierung auf dem gesamten Heap durch (wird gleichzeitig mit der Anwendung ausgeführt). Dieser Vorgang kann durch junge GC unterbrochen werden. Wenn während der gleichzeitigen Markierungsphase festgestellt wird, dass alle Objekte im Bereichsobjekt Müll sind, wird der Bereich sofort recycelt (X im Bild). Gleichzeitig wird während des gleichzeitigen Markierungsprozesses die Objektaktivität jeder Region (der Anteil der überlebenden Objekte in der Region) berechnet.

Java-GC-Algorithmus-Garbage Collector

4. Hinweis: Es wird eine kurze Pause geben (STW). Die Neumarkierungsphase wird verwendet, um neuen Müll zu sammeln, der durch die gleichzeitige Markierungsphase erzeugt wird (die gleichzeitige Phase wird zusammen mit der Anwendung ausgeführt). G1 verwendet einen anfänglichen Snapshot-Algorithmus, der schneller als CMS ist: Snapshot-at-the-Begining (SATB). .

5. Kopieren/Aufräumen, Multi-Thread-Löschen inaktiver Objekte, es wird STW geben. G1 kopiert die verbleibenden Objekte im Recyclingbereich in den neuen Bereich, löscht die Erinnerungssätze, löscht gleichzeitig den Recyclingbereich und gibt ihn an die verknüpfte Liste des freien Bereichs zurück.

Java-GC-Algorithmus-Garbage Collector

6. Nach dem Kopier-/Löschvorgang. Aktive Objekte im Recyclingbereich wurden in dunkelblauen und dunkelgrünen Bereichen konzentriert.

Java-GC-Algorithmus-Garbage Collector

Häufig verwendete Kollektorkombinationen

Java-GC-Algorithmus-Garbage Collector

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