CodeGym/Java-Kurse/Modul 3: Java Professional/Generationsübergreifende Müllabfuhr

Generationsübergreifende Müllabfuhr

Verfügbar

Arbeiten mit Generationen von Objekten

Java-Garbage Collectors implementieren eine Generationen-Garbage-Collection-Strategie, mit der Objekte nach Alter klassifiziert werden können.

Eine solche Notwendigkeit (alle Objekte zu markieren und zu komprimieren) in der JVM kann als ineffizient bezeichnet werden. Da eine große Anzahl von Objekten zugewiesen wird, wächst deren Liste, was zu einer Verlängerung der Speicherbereinigungszeit führt. Die empirische Analyse von Anwendungen hat gezeigt, dass die meisten Objekte in Java nur von kurzer Dauer sind.

Der Heap-Speicherbereich in der JVM ist in drei Abschnitte unterteilt:

Arbeiten mit Generationen von Objekten

Jüngere Generation

Neu erstellte Objekte beginnen in der jüngeren Generation. Die jüngere Generation wird weiter in zwei Kategorien unterteilt.

  • Eden Space – Alle neuen Objekte beginnen hier, ihnen wird Anfangsspeicher zugewiesen.
  • Survivor Spaces (FromSpace und ToSpace) – Objekte werden von Eden hierher verschoben, nachdem sie einen Garbage-Collection-Zyklus überstanden haben.

Der Prozess, bei dem Objekte der jüngeren Generation durch Müll gesammelt werden, wird als kleineres Müllsammelereignis bezeichnet.

Wenn Edens Raum mit Objekten gefüllt ist, wird eine kleine Speicherbereinigung durchgeführt. Alle toten Gegenstände werden entfernt und alle lebenden auf eines der verbleibenden zwei Felder verschoben. Der kleine GC überprüft auch Objekte im Überlebensraum und verschiebt sie in einen anderen (nächsten) Überlebensraum.

Nehmen wir als Beispiel die folgende Sequenz.

  1. In Eden gibt es Objekte beider Arten (lebende und tote).
  2. Es findet ein kleiner GC statt – alle toten Objekte werden aus Eden entfernt. Alle lebenden Objekte werden in Raum-1 (FromSpace) verschoben. Eden und Space-2 sind jetzt leer.
  3. Neue Objekte werden erstellt und zu Eden hinzugefügt. Einige Objekte in Eden und Space-1 werden tot.
  4. Es kommt zu einem kleinen GC – alle toten Objekte werden aus Eden und Space-1 entfernt. Alle lebenden Objekte werden in Raum-2 (ToSpace) verschoben. Eden und Raum-1 sind leer.

Somit ist zu jedem Zeitpunkt immer einer der Überlebensplätze leer. Wenn Überlebende eine bestimmte Schwelle für die Bewegung durch Überlebensräume erreichen, steigen sie zu einer älteren Generation auf.

Sie können das Flag -Xmn verwenden , um die Größe der jungen Generation festzulegen .

Ältere Generation

Objekte, die eine beträchtliche Zeitspanne leben (z. B. den größten Teil der Lebensdauer eines Programms), werden schließlich zu älteren Objekten – Hundertjährigen. Sie wird auch als reguläre Generation bezeichnet und enthält Objekte, die schon lange in Survivor Spaces zurückgelassen wurden.

Der Lebensdauerschwellenwert eines Objekts bestimmt, wie viele Garbage-Collection-Zyklen es durchlaufen muss, bevor es in die ältere Generation verschoben wird. Der Vorgang, bei dem Objekte der älteren Generation in den Müll verschoben werden, wird als Hauptereignis der Müllsammlung bezeichnet.

Sie können die Flags -Xms und -Xmx verwenden , um die anfängliche und maximale Heap-Speichergröße festzulegen .

Da Java die generationsübergreifende Garbage Collection verwendet, bewegt sich ein Objekt umso weiter auf dem Heap, je mehr Garbage Collection-Ereignisse es gibt. Er beginnt in der jüngeren Generation und landet schließlich in der regulären Generation, wenn er lange genug lebt.

Um die Förderung von Objekten zwischen Räumen und Generationen zu verstehen, betrachten Sie das folgende Beispiel:

Wenn ein Objekt erstellt wird, wird es zunächst im Eden-Raum der jungen Generation platziert.

Sobald eine kleine Speicherbereinigung stattfindet, werden lebende Objekte aus Eden nach FromSpace verschoben. Wenn die nächste kleinere Garbage Collection stattfindet, werden lebende Objekte sowohl aus Eden als auch aus dem Weltraum in ToSpace verschoben.

Dieser Zyklus wird eine bestimmte Anzahl von Malen fortgesetzt. Wenn das Objekt nach diesem Zeitpunkt immer noch „in Betrieb“ ist, wird es beim nächsten Garbage-Collection-Zyklus in den Speicherplatz der älteren Generation verschoben.

Permanente Generation und Metaraum

Metadaten wie Klassen und Methoden werden in der persistenten Generierung gespeichert. Die JVM füllt es zur Laufzeit basierend auf den von der Anwendung verwendeten Klassen. Klassen, die nicht mehr verwendet werden, können von der permanenten Generierung in den Müll übergehen.

Sie können die Flags -XX:PermGen und -XX:MaxPermGen verwenden , um die anfängliche und maximale Größe der permanenten Generation festzulegen .

Metaraum

Seit Java 8 wurde der PermGen-Speicherplatz durch den MetaSpace-Speicherplatz ersetzt. Die Implementierung unterscheidet sich von PermGen – dieser Heap-Speicherplatz wird nun automatisch geändert.

Dadurch wird das Problem des unzureichenden Arbeitsspeichers der Anwendung vermieden, das aufgrund der begrenzten Größe des Heap-Speicherplatzes von PermGen auftritt. Der Metaspace-Speicher kann durch Müll gesammelt werden, und Klassen, die nicht mehr verwendet werden, werden automatisch bereinigt, wenn der Metaspace seine maximale Größe erreicht.

Kommentare
  • Beliebt
  • Neu
  • Alt
Du musst angemeldet sein, um einen Kommentar schreiben zu können
Auf dieser Seite gibt es noch keine Kommentare