Tiefes Verständnis des Java Virtual Machine (Second Edition) -Garbage Collection-Algorithmus

Inhaltsverzeichnis

 

3.3.1 Mark-Clear-Algorithmus

3.3.2 Kopieralgorithmus

3.3.3 Markierungssortierungsalgorithmus

3.3.4 Generationserfassungsalgorithmus


3.3.1 Mark-Clear-Algorithmus

Der grundlegendste Erfassungsalgorithmus ist der "Mark-Sweep" -Algorithmus. Wie sein Name ist der Algorithmus in zwei Stufen unterteilt: "Marking" und "Sweeping": Zunächst werden alle Objekte markiert, die recycelt werden müssen. Nach Abschluss werden alle markierten Objekte einheitlich wiederhergestellt. Der Markierungsprozess wurde im vorherigen Abschnitt zur Bestimmung der Objektmarkierung eingeführt. Der Grund, warum es als der grundlegendste Erfassungsalgorithmus bezeichnet wird, besteht darin, dass nachfolgende Erfassungsalgorithmen auf dieser Idee basieren und ihre Mängel verbessern.
Es weist zwei Hauptmängel auf : Zum einen ist das Effizienzproblem , die Effizienz der Markierungs- und Löschprozesse ist nicht hoch, zum anderen ist das Platzproblem . Nach dem Löschen der Markierung wird eine große Anzahl diskontinuierlicher Speicherfragmente erzeugt, und es kann zu viel Speicherplatzfragmentierung verursachen Wenn später ein größeres Objekt während der Ausführung des Programms zugewiesen werden muss, kann es nicht genügend zusammenhängenden Speicher finden und muss im Voraus eine weitere Speicherbereinigung auslösen. Der Ausführungsprozess des Mark-Clear-Algorithmus ist in Abbildung 3-2 dargestellt.

 

3.3.2 Kopieralgorithmus

Um das Problem der Effizienz zu lösen, wurde ein Erfassungsalgorithmus namens "Kopieren" angezeigt, der den verfügbaren Speicher je nach Kapazität in zwei gleich große Teile aufteilt und jeweils nur einen Teil verwendet. Wenn dieser Speicherblock aufgebraucht ist, werden die überlebenden Objekte in einen anderen Block kopiert, und der verwendete Speicherplatz wird sofort bereinigt. Auf diese Weise wird der gesamte halbe Bereich jedes Mal zurückgefordert, und es ist nicht erforderlich, Speicherfragmentierung und andere komplexe Situationen bei der Speicherzuweisung zu berücksichtigen. Bewegen Sie einfach den Zeiger oben auf den Heap und weisen Sie den Speicher in der Reihenfolge zu, die einfach zu implementieren und effizient auszuführen ist. Es ist nur so, dass die Kosten dieses Algorithmus darin bestehen, den Speicher auf die
Hälfte des Originals zu reduzieren , was zu hoch ist. Der Ausführungsprozess des Replikationsalgorithmus ist in Abbildung 3-3 dargestellt.

  • Aktuelle kommerzielle virtuelle Maschinen verwenden alle diesen Erfassungsalgorithmus, um die neue Generation zu recyceln. Die speziellen Untersuchungen von IBM zeigen, dass 98% der Objekte in der neuen Generation "live and die" sind, sodass sie nicht im Verhältnis 1: 1 aufgeteilt werden müssen. Der Speicherbereich, aber der Speicher ist jedes Mal, wenn Sie Eden und einen der Überlebenden verwenden, in einen größeren Eden-Bereich und zwei kleinere Survivor-Bereiche unterteilt. Kopieren Sie beim Recycling die überlebenden Objekte in Eden und Survivor gleichzeitig in einen anderen Survivor-Bereich und bereinigen Sie schließlich Eden und den gerade verwendeten Survivor-Bereich. Das Standardverhältnis von Eden zu Survivor für die virtuelle HotSpot-Maschine beträgt 8: 1, was bedeutet, dass der verfügbare Speicherplatz in jeder neuen Generation 90% (80% + 10%) der gesamten Kapazität der neuen Generation beträgt und nur 10% des Speichers "verschwendet" werden. ". Natürlich sind 98% der Objekte, die zurückgefordert werden können, nur Daten in allgemeinen Szenarien. Wir können nicht sicherstellen, dass nicht mehr als 10% der Objekte jedes Mal überleben. Wenn der Survivor-Speicherplatz nicht ausreicht, müssen Sie sich auf anderen Speicher verlassen (hier wird auf die alte Generation verwiesen). Vertriebsgarantie (Handle Promotion).
  • Die Speicherzuweisungsgarantie ist so, als würde man zur Bank gehen, um Geld zu leihen. Wenn wir einen guten Ruf haben, können wir in 98% der Fälle pünktlich zurückzahlen, sodass die Bank davon ausgehen kann, dass wir das Darlehen beim nächsten Mal pünktlich und in der Höhe zurückzahlen können, ist nur eine Garantie erforderlich. Die Leute können garantieren, dass die Bank glaubt, dass kein Risiko besteht, wenn ich Geld von seinem Konto abziehen kann, wenn ich nicht zurückzahlen kann. Die Speicherzuweisungsgarantie ist ebenfalls dieselbe. Wenn ein anderer Teil des Survivor-Speicherplatzes nicht über genügend Speicherplatz verfügt, um die in der neuen Generation gesammelten überlebenden Objekte abzulegen, werden diese Objekte über den Zuweisungsgarantiemechanismus direkt in die alte Generation eingegeben. Der Inhalt der Zuweisungsgarantie für die neue Generation wird später in diesem Kapitel ausführlich erläutert, wenn die Ausführungsregeln für den Garbage Collector erläutert werden.

3.3.3 Markierungssortierungsalgorithmus

Der Kopiersammlungsalgorithmus führt mehr Kopiervorgänge aus, wenn die Objektüberlebensrate hoch ist und die Effizienz geringer ist. Noch wichtiger ist, wenn Sie nicht 50% des Speicherplatzes verschwenden möchten, benötigen Sie zusätzlichen Speicherplatz für Zuweisungsgarantien, um die extreme Situation zu bewältigen, in der alle Objekte im verwendeten Speicher zu 100% lebendig sind. Daher wird dies im Alter im Allgemeinen nicht direkt verwendet. Algorithmus.
Entsprechend den Merkmalen des Alters schlug jemand einen anderen "Mark-Compact" -Algorithmus vor. Der Markierungsprozess ist immer noch der gleiche wie der "Mark-Clear" -Algorithmus, aber die nachfolgenden Schritte bereinigen recycelbare Objekte nicht direkt. Stattdessen werden alle überlebenden Objekte an ein Ende verschoben, und der Speicher außerhalb der Endgrenze wird direkt bereinigt. Das schematische Diagramm des Algorithmus "Marking-Finishing" ist in Abbildung 3-4 dargestellt.

3.3.4 Generationserfassungsalgorithmus

Die aktuelle Garbage Collection kommerzieller virtueller Maschinen verwendet den Algorithmus "Generational Collection". Dieser Algorithmus hat keine neuen Ideen, sondern unterteilt den Speicher entsprechend dem Lebenszyklus des Objekts in mehrere Blöcke. Im Allgemeinen wird der Java-Heap in neue und alte Generationen unterteilt, sodass der am besten geeignete Erfassungsalgorithmus entsprechend den Merkmalen jeder Generation übernommen werden kann. In der neuen Generation stirbt jedes Mal eine große Anzahl von Objekten, wenn eine Speicherbereinigung durchgeführt wird, und nur wenige überleben. Dann wird der Replikationsalgorithmus ausgewählt, und die Sammlung kann nur abgeschlossen werden, indem die Replikationskosten einer kleinen Anzahl überlebender Objekte bezahlt werden. Da das Objekt im Alter eine hohe Überlebensrate und keinen zusätzlichen Platz für seine Zuordnungsgarantie aufweist, muss für das Recycling der Algorithmus "Mark-Clean-Up" oder "Mark-Clean-Up" verwendet werden.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ich denke du magst

Origin blog.csdn.net/someby/article/details/103880289
Empfohlen
Rangfolge