Die Zuweisung und Veröffentlichung des Speichers in Java und C# werden automatisch von virtuellen Maschinen verwaltet. Ich habe zuvor die GC-Objektrecyclingmethode in CLR eingeführt, bei der es sich um eine erzeugungsbasierte Speicherrecyclingstrategie handelt. Tatsächlich basiert in Java die JVM -Objekt -Recycling -Strategie auch auf der Idee der Generationsabteilung. Der Zweck davon ist, den Müll zu erhöhen
Die Leistung des Recyclings vermeidet die Verzögerung in der Programmantwort, die durch Überprüfung aller Objekte im Haufen verursacht wird, da die Ausführung von GC, wenn JVM ausgeführt wird, das Wort stoppt, dh die Funktionsweise anderer Threads beendet und nur die Operationen anderer Threads nach Abschluss des Recyclings wiederherstellt. Die Idee, die auf Generationenabteilung basiert, lautet: JVM braucht bei jedem Ausführen des Müllsammlers nur einen kleinen Teil des Gedächtnisses.
Objektreferenzen werden überprüft, und diese kleine Anzahl von Objekten hat einen kürzeren Lebenszyklus, der die Leistung der Müllsammlung beschleunigt. Im Folgenden werden wir in Zukunft die grundlegenden Strategien von erzeugungsbasierten Speicherwiederherstellungsalgorithmen in Java vorstellen:
1. Generation Division des JVM Heap -Speichers
In einer erzeugungsbasierten Gedächtniswiederherstellungsstrategie ist der Haufenraum normalerweise in drei Generationen, junge Generation, alte Generation (oder feste Generation) und dauerhafte Generation unterteilt. Unter der jungen Generation gibt es drei kleine Gebiete: Eden, S0 und S1, wie in der folgenden Abbildung gezeigt:
Unter ihnen werden die neuen Objekte immer der Altersgenerierung zugeordnet. Wenn der Raum der jungen Generation gefüllt ist, muss eine Müllsammlung durchgeführt werden, dh geringfügige GC wird ausgeführt, um die nicht mehr verwiesenen Objekte zu recyceln und gleichzeitig das Alter der überlebenden Objekte zu erhöhen. Die überlebenden Objekte in der Altersgenerierung haben ein Altersidentifikationsfeld. Sobald sie eine bestimmte Schwelle erreicht haben, werden die immer noch überlebenden Objekte in den Raum der alten Generation gefördert.
Der Raum der alten Generation wird verwendet, um Objekte zu speichern, die lange Zeit überlebt haben, dh Objekte mit einem langen Lebenszyklus. Sobald die überlebenden Objekte im Raum der jungen Generation eine bestimmte Altersschwelle erreichen, wird sie automatisch für die alte Generation gefördert. Wenn der Raum der alten Generation mit Objekten gefüllt ist, wird der Major GC einmal ausgeführt. Im Vergleich zu Minor GC ist die Anzahl der Hinrichtungen von Major GC viel geringer als die von kleinerem GC. Gleichzeitig führt Major GC länger als kleiner GC aus. Weil es mehr Objektscannen beinhaltet. Diese Generationsidee basiert auch auf der besseren Wahl in der Praxis, dass die neu zugewiesenen Objekte in der Praxis einen kürzeren Lebenszyklus haben und die älteren Objekte einen längeren Lebenszyklus haben.
Gleichzeitig, wenn kleinere GC und Major GC die Müllsammlung ausführen, nehmen sie das World -Ereignis ab, dh die laufenden Threads beenden und alle Threads wiederherstellen, wenn der GC ausgeführt wird.
Für den Speicher der dauerhaften Generation wird hauptsächlich zur Speicherung relevanter Informationen von Metadaten, Informationen zu Klassen und Methoden verwendet. Wenn eine Klasse nicht mehr verwendet wird, wird sie recycelt. Wenn die vollständige GC ausgeführt wird, wird der Speicher der dauerhaften Generation für die Müllsammlung gescannt.
2. Verarbeitungsprozess der erzeugungsbasierten Müllsammlung
Zunächst ist das neue Objekt am Anfang dem Eden -Bereich zugeordnet, S0 und S1 sind leer. Wenn der Raum in Eden gefüllt ist, führen Sie einmal ein kleines GC durch. Der Müllsammler verschiebt das referenzierte Objekt in den S0 -Bereich, und die nicht mehr verwiesenen Objekte werden gelöscht. Gleichzeitig beträgt das Alter des überlebenden Objekts 1. Nachdem GC identifiziert wurde, sind die EDEN- und S1 -Bereiche wie in der folgenden Abbildung gezeigt.
Wenn das nächste Mal ein kleines GC ausgeführt wird, ist der einzige Unterschied, dass das referenzierte Objekt, das heißt, das überlebende Objekt, in den S1 -Bereich verschoben wird, und das Alter des im S0 -Bereich überlebenden Objekts erhöht sich um 1 und wird 2, wie in der folgenden Abbildung gezeigt.
Wenn wieder kleiner GC ausgeführt wird
Wenn der Minor GC endgültig ausgeführt wird, wird festgestellt, dass das überlebende Objekt in S1 8 erreicht (vorausgesetzt, der Schwellenwert wird auf 8 gesetzt) und das Objekt in den Altersspeicher gefördert, wie in der folgenden Abbildung gezeigt.
Z
Wenn der alte Heap -Raum mit Objekten gefüllt ist, wird einmal ein Major GC ausgeführt, wodurch Objekte gelöscht werden, auf die der alte Haufen nicht mehr verwiesen wird, und gleichzeitig den Raum komprimieren. Wie in der Abbildung unten gezeigt.
Die obige kurze Diskussion über die Müllrecyclingstrategie in JVM ist der gesamte Inhalt, den ich mit Ihnen teile. Ich hoffe, Sie können Ihnen eine Referenz geben und ich hoffe, Sie können wulin.com mehr unterstützen.