Dieser Artikel enthält eine Zusammenfassung des Lernens des Java-Garbage-Collection-Mechanismus
Speicherverlust: Speicherverlust bedeutet, dass der Speicherplatz nach seiner Verwendung nicht recycelt wird. Im Allgemeinen treten Speicherlecks in Java auf, weil der Lebenszyklus des Speicherobjekts die Zeitdauer überschreitet, in der es im Programm vorhanden ist
Die Bedeutung der Garbage Collection: Lösen Sie die Speicherverwaltungsprobleme, die beim Programmieren berücksichtigt werden müssen , und das Problem von Speicherlecks effektiv lösen, Nutzen Sie den freien Speicherplatz voll aus. Java-Objekte haben nicht mehr das Konzept des Gültigkeitsbereichs, nur Verweise auf Objekte haben einen Gültigkeitsbereich.
Grundoperationen : (1) Entdecken Sie nutzlose Objekte; (2) Recyceln Sie den von nutzlosen Objekten eingenommenen Raum und geben Sie ihn in einen Raum frei, der von ihnen wieder genutzt werden kann Programm.
Recyclingzeit : Der genaue Zeitpunkt, zu dem die Müllabfuhr stattfindet, ist unvorhersehbar. Im Allgemeinen gibt es zwei Möglichkeiten:
Der Programmierer ruft die GC-Schnittstelle der JVM auf, teilt dem System jedoch nur mit, dass er die Speicherbereinigung durchführen möchte. Die spezifische Zeit wird vom System bestimmt.
Wenn das Programm ausgeführt wird Es wird ein Speicherblock benötigt, der zu diesem Zeitpunkt nicht ausreichen kann. Wenn der Block groß ist, ruft das System GC zur Speicherbereinigung auf.
Recycling-Algorithmus :
Referenzzählmethode
Inhalt: Jedes Objekt wird erstellt, wenn das Wenn eine Objektinstanz einer Variablen zugewiesen wird (Referenzzähler genannt), wird der Anfangswert der Variablenanzahl auf 1 gesetzt. Wenn auf das Objekt verwiesen wird, wird der Zählwert um 1 erhöht. Wenn eine Referenz einer Objektinstanz die Lebensdauer überschreitet Zyklus oder ist Bei der Einstellung auf einen anderen Wert wird der Referenzzähler um 1 dekrementiert. Wenn der Referenzzählerwert 0 erreicht, kann er durch Müll gesammelt werden. (Hinweis: Diese Objektinstanz kann auch auf andere Objekte verweisen. Wenn das Objekt also recycelt wird, werden die Zähler aller Objekte, auf die es verweist, um 1 reduziert.)
Bewertung: Kann in der Realität schneller ausgeführt werden Zeit Unter dem System ist es bequemer, kann jedoch das Zirkelverweisproblem nicht lösen. Beispielsweise verweisen Objekt a und Objekt b aufeinander, aber die Werte von a und b sind null zugewiesen. Zu diesem Zeitpunkt kann nicht mehr auf die von a und b referenzierten Objekte zugegriffen werden, sie verweisen jedoch auf einander, wodurch der Wert ihres Referenzzählers ungleich 0 ist. Zu diesem Zeitpunkt wird der GC sie niemals zurückfordern.
Root-Suchalgorithmus
Inhalt: Behandeln Sie alle Referenzbeziehungen im Programm als Diagramm, beginnen Sie mit dem Root-Knoten GC Root-Objekt und suchen Sie den Knoten, der der Referenz entspricht usw. Alle Referenzknoten bilden ein Diagramm, und die verbleibenden Knoten werden als nicht referenzierte Knoten betrachtet, dh als nutzlose Knoten.
Die in Java als GC-Root-Objekte verwendeten Objekte sind: Objekte, auf die im Stapel der Java Virtual Machine verwiesen wird, Objekte, auf die durch statische Eigenschaften im Methodenbereich verwiesen wird, Objekte, auf die durch Konstanten im Methodenbereich verwiesen wird, und Objekte, auf die im verwiesen wird lokaler Methodenstapel
Mark-Clear-Algorithmus
Inhalt: Scannen Sie aus der Stammsammlung, markieren Sie überlebende Objekte und scannen Sie dann nicht markierte Objekte zum Recycling nach allen Scans.
Bewertung: Objekte müssen nicht verschoben werden, es werden nur nicht überlebende Objekte verarbeitet. Es ist effizienter, wenn viele überlebende Objekte vorhanden sind, es führt jedoch zu einer Speicherfragmentierung.
Mark-Organization-Algorithmus
Inhalt: Basierend auf Algorithmus 3 werden nach dem Recycling nutzloser Objekte alle überlebenden Objekte in den freien Speicherplatz verschoben, um den freien Speicher zu organisieren.
Bewertung: Die Gemeinkosten steigen, aber das Fragmentierungsproblem ist gelöst.
Hinweis: Die Algorithmen 3, 4 und 5 gehören alle zu Root-Suchalgorithmen und werden hier zum leichteren Verständnis separat beschrieben.
Kopieralgorithmus
Inhalt: Teilen Sie den Speicher in den Objektbereich und den freien Bereich auf, scannen Sie den Objektbereich und kopieren Sie dann alle gültigen Knoten im Objektbereich hinein Sequenz in den freien Bereich, geben Sie den ursprünglichen Objektbereich frei, und dann wird der ursprüngliche Objektbereich zum freien Bereich. Die Garbage Collection wird während des Wechsels zwischen dem Objektbereich und dem freien Bereich abgeschlossen.
Bewertung: Das Recycling von Handles wird reduziert und es tritt keine Fragmentierung auf, aber das Programm muss während des Umschaltvorgangs angehalten werden.
Generierungsalgorithmus
wird zum Speichern statischer Dateien wie Java-Klassen, Methoden usw. verwendet. Die persistente Generation hat keinen wesentlichen Einfluss auf die Garbage Collection
Objekte, die nach N Garbage Collections in der jungen Generation noch überleben, werden in der alten Generation platziert. Daher kann davon ausgegangen werden, dass die alte Generation Objekte mit langen Lebenszyklen speichert.
Der Speicher ist viel größer als der der neuen Generation (wahrscheinlich beträgt das Verhältnis 1:2), wenn der Speicher der alten Generation voll ist, d. h. Full GC Der GC ist relativ niedrig und die Überlebenszeit von Objekten der alten Generation ist relativ hoch.
Alle neu generierten Objekte werden zunächst in der jungen Generation platziert. Ziel der jungen Generation ist es, möglichst schnell Objekte mit kurzen Lebenszyklen zu sammeln.
Der Speicher der neuen Generation ist im Verhältnis 8:1:1 in einen Eden-Bereich und zwei Survivor-Bereiche (Survivor0, Survivor1) unterteilt. Ein Eden-Bereich und zwei Survivor-Bereiche (im Allgemeinen). Die meisten Objekte werden im Eden-Bereich generiert. Kopieren Sie beim Recycling zunächst die überlebenden Objekte im Eden-Bereich in einen Survivor0-Bereich und löschen Sie dann den Eden-Bereich. Wenn dieser Survivor0-Bereich ebenfalls voll ist, kopieren Sie die überlebenden Objekte im Eden-Bereich und im Survivor0-Bereich in einen anderen Survivor1-Bereich und dann Löschen Sie Eden und diesen Bereich. Der Bereich survivor0 ist zu diesem Zeitpunkt leer, und dann werden der Bereich survivor0 und der Bereich survivor1 ausgetauscht, dh der Bereich survivor1 bleibt leer und so weiter.
Wenn der Bereich survivor1 nicht ausreicht, um die überlebenden Objekte von Eden und survivor0 zu speichern, werden die überlebenden Objekte direkt in der alten Generation gespeichert. Wenn auch die alte Generation voll ist, wird ein vollständiger GC ausgelöst, das heißt, sowohl die neue als auch die alte Generation werden recycelt
Der GC, der in der neuen Generation auftritt, wird auch als Minor GC bezeichnet Häufigkeit von Minor GC ist relativ hoch (nicht unbedingt im Eden-Bereich)
Inhalt: Basierend auf den unterschiedlichen Lebenszyklen verschiedener Objekte werden Objekte in Generationen verarbeitet (unterteilt in drei Generationen: neue Generation, alte Generation und persistente Generation).
Neue Generation:
Alte Generation:
Persistente Generation:
Das obige ist der detaillierte Inhalt vonTeilen Sie die Lernzusammenfassung des Java-Garbage-Collection-Mechanismus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!