In Java werden alle Objekte mit Ausnahme von Basistypen wie Ganzzahlen und Referenzen im Heap-Bereich und nicht im Stapelbereich zugewiesen. Dieses Design macht es für Programmierer überflüssig, auf den Lebenszyklus von Variablen zu achten, allerdings auf Kosten der Erzeugung von mehr Müll.
Erreichbarkeit
Daten, auf die das Programm durch Dereferenzierung eines beliebigen Zeigers direkt zugreifen kann, sind erreichbar.
Prinzip der Lokalität
Wenn es wahrscheinlich ist, dass auf den Speicherort eines Programms in kurzer Zeit erneut zugegriffen wird, spricht man von zeitlicher Lokalität des Programms. Ein Programm ist räumlich lokalisiert, wenn es wahrscheinlich ist, dass innerhalb einer kurzen Zeitspanne auf einen Ort neben einem Speicherort zugegriffen wird, auf den zugegriffen wird.
Es wird allgemein angenommen, dass ein Programm 90 % seiner Zeit damit verbringt, 10 % des Codes auszuführen.
Die Prinzipien mehrerer Garbage Collectors
Mark-Sweep-Collector
Dieser Collector durchläuft zunächst den Objektgraphen und markiert erreichbare Objekte und scannt dann den Stapel, um nicht markierte Objekte zu finden Objekte und geben ihr Gedächtnis frei. Diese Art von Kollektor verwendet im Allgemeinen einen einzelnen Thread zum Arbeiten und stoppt andere Vorgänge. Da außerdem nur die nicht markierten Objekte gelöscht und die markierten Objekte nicht komprimiert werden, kommt es zu einer starken Speicherfragmentierung, wodurch Speicher verschwendet wird.
Mark-Compact Collector
Manchmal auch Mark-Sweep-Compact Collector genannt, hat er die gleiche Markierungsphase wie der Mark-Sweep Collector. In der zweiten Phase wird das markierte Objekt in einen neuen Bereich des Stapels kopiert, um den Stapel zu komprimieren. Dieser Kollektor stoppt auch andere Vorgänge.
Kopierender Kollektor
Dieser Kollektor unterteilt den Stapel in zwei Domänen, die oft als Halbräume bezeichnet werden. Es wird jeweils nur die Hälfte des Speicherplatzes genutzt, und in der anderen Hälfte des Speicherplatzes werden neue, von der JVM generierte Objekte platziert. Wenn der GC ausgeführt wird, kopiert er die erreichbaren Objekte in die andere Hälfte des Speicherplatzes und komprimiert so den Stapel. Diese Methode eignet sich für kurzlebige Objekte. Das kontinuierliche Kopieren langlebiger Objekte führt zu einer verringerten Effizienz. Und für einen Heap mit gegebener Größe ist die doppelte Menge an Speicher erforderlich, da immer nur die Hälfte davon verwendet wird.
Inkrementeller Kollektor
Der inkrementelle Kollektor teilt den Stapel in mehrere Domänen auf und sammelt jeweils nur Müll von einer Domäne. Dies kann auch als Aufteilung des Stapels in nur eine Domäne verstanden werden Block ist Müll, der jeweils gesammelt wird. Dies führt zu einem kleinen Anwendungsausfall, sodass der Benutzer im Allgemeinen nicht bemerkt, dass der Garbage Collector funktioniert.
Partielles Recyclingprinzip
Normalerweise liegen 80 % bis 90 % der neu zugewiesenen Objekte innerhalb weniger Millionen Anweisungen oder werden neu zugewiesen.
Generationen-Müllkühlung
Es basiert auf dem Kopiersammler- und Teilrecyclingprinzip.
Eine effektive Möglichkeit, die „jung sterben“-Eigenschaft der meisten Objekte zu nutzen.
Teilen Sie den Heap in eine Reihe kleiner Bereiche und nummerieren Sie diese mit 0, 1, 2 ... n. Je kleiner die Zahl, desto jünger ist das in dem Bereich gespeicherte Objekt 0-Bereich. Nach dem Erstellen und Füllen wird der Müll gesammelt und die erreichbaren Objekte in Bereich 1 verschoben. Jede Runde der Müllsammlung wird für den Bereich mit einer Seriennummer kleiner oder gleich i durchgeführt, wobei i die höchste Zahl ist der aktuell gefüllten Fläche.
Solange i recycelt wird, werden auch alle Bereiche mit der Seriennummer i im Müll gesammelt. Dies liegt daran, dass jüngere Generationen tendenziell mehr Müll enthalten, was bedeutet, dass sie häufiger recycelt werden.
Die älteste Generation bewahrt die ausgereiftesten Gegenstände auf, und das Recycling dieser Gegenstände ist am teuersten, was einem vollständigen Recycling entspricht. Kann zu längeren Pausen führen. Die Lösung besteht darin, den Zugalgorithmus zu verwenden.
Die vier GC-Sammler von HotSpot:
Serieller Sammler:
Funktionen: Die Anwendung wird während des Recyclings angehalten.
Junger Bereich: Kombinieren Sie Eden und einen Survivor-Bereich. Überlebende Objekte werden in einen anderen Survivor-Bereich kopiert (auf TO gesetzt) (Große Objekte werden direkt im alten Bereich platziert, wenn der TO-Bereich voll ist, werden sie direkt in den alten Bereich kopiert: Verwenden Sie also den Mark-Sweep-Compact-GC-Algorithmus.) Markieren Sie zuerst die überlebenden Objekte, löschen Sie dann die verworfenen Objekte und verschieben Sie die überlebenden Objekte dann in einen Bereich, um mehr freien Speicherplatz freizugeben.
Anwendungsbereich: Die meisten Clientanwendungen können diesen Recycling-Algorithmus verwenden auch der Standard-Recycling-Algorithmus von HotSpot. Auf der aktuellen Maschine (2006) dauert das vollständige Recycling eines 64-MB-Bereichs weniger als eine halbe Sekunde -core-CPU kann verwendet werden.
Junger Bereich: Die Anwendung muss weiterhin angehalten werden. Der grundlegende Mechanismus ähnelt der Serialisierung, es wird jedoch Multithreading verwendet.
Kann auf Multi-Core-Computern verwendet werden.
Parallelverdichtungssammler:
Im Vergleich zum Parallelrecycling verfügt es hauptsächlich über einen neuen Algorithmus im alten Bereich. Gleichzeitig wird diese Art des Recyclings dem Whitepaper zufolge letztendlich das Parallelrecycling ersetzen.
junger Bereich: Wie paralleles Recycling. Teilen Sie zuerst den alten Bereich in mehrere aufeinanderfolgende Bereiche auf und markieren Sie die aktiven Objekte (markieren Sie zuerst die Objekte, auf die direkt verwiesen werden kann, dann alle). Beginnen Sie dann mit der Überprüfung dieser Bereiche, um die Dichte zu ermitteln (der Bereich links ist definitiv dichter als der Bereich rechts), beginnend mit einem Bereich, der nicht sehr dicht ist, und komprimieren Sie den Bereich rechts parallel Anwendungsbereich: Für Umgebungen mit Multi-Core- und Pausenzeitanforderungen ist es aufgrund der alten Methode besser, parallele Komprimierung und Recycling zu verwenden als paralleles Recycling Bereich Die Sammlung ist langsam und multithreaded, sodass sich der GC einer Anwendung auf andere Anwendungen auswirkt. Die entsprechende Lösung: Sie können konfigurieren, um die Anzahl der parallelen Threads zu reduzieren.
Gleichzeitiger Mark Sweep-Kollektor:
junger Bereich: Gleich wie paralleles Recycling.
alter Bereich: in mehrere Schritte unterteilt.
Anfangsmarkierung: Wenn GC ausgeführt werden muss, halten Sie zuerst die Anwendung an und markieren Sie dann alle direkt referenzierten Objekte.
Gleichzeitige Markierung: Fahren Sie dann mit der Anwendung fort und überprüfen Sie gleichzeitig die markierten Objekte, um alle überlebenden Objekte zu erhalten.
Hinweis: Halten Sie die Anwendung erneut an und überprüfen Sie die von der Anwendung während der Dauer der gleichzeitigen Markierung geänderten Objekte (neu, aufgegeben) und markieren Sie sie Die überlebenden Objekte dauern lange, daher wird Multithreading verwendet. Nach Ablauf der Phase werden alle überlebenden Objekte markiert und nicht markierte Objekte werden gelöscht Geben Sie den Speicherplatz aller Müllobjekte frei.
Unterschiede zu anderen Algorithmen:
Erstens: Es wird keine Komprimierung durchgeführt, die jedoch durch Berechnung des möglichen Speicherbedarfs berechnet wird. Teilen Sie bestimmte Speicherblöcke auf.
Drittens: Da keine Komprimierung durchgeführt wird, kommt es zu einer Fragmentierung 🎜>
Darüber hinaus kann CMS auch einen inkrementellen Betrieb verwenden, was bedeutet, dass nur ein Teil der Arbeit während der Concurrentmark-Phase ausgeführt wird und die Ressourcen dann an die Anwendung zurückgegeben werden. Die Arbeit des Recyclers wird in mehrere Teile aufgeteilt und eingeplant zwei junge Die Leerlaufphase des regionalen Recyclings ist abgeschlossen. Dieser Modus wird im Allgemeinen verwendet, wenn eine Pausenzeit erforderlich ist und die Anzahl der Prozessoren nicht groß ist (Single-Core oder Dual-Core). CMS wird reduziert. Reduzieren Sie die Pausenzeit des alten GC (manchmal ist der Effekt sehr signifikant) und verlängern Sie die Zeit des jungen GC geringfügig (da die Zeit für die Bewegung von Objekten vom jungen Bereich in den alten Bereich länger ist: Es wird keine Komprimierung durchgeführt , also muss zuerst ein geeigneter Bereich gefunden werden), reduzieren Es verbessert die Ausführungseffizienz des gesamten Systems und erhöht den Bedarf an Speicherplatz erheblich.
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung mehrerer Garbage-Collection-Prinzipien in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!