CodeGym/Java-Kurse/Modul 3: Java Professional/Garbage Collection in Java

Garbage Collection in Java

Verfügbar

Erinnern Sie sich daran, was Garbage Collection in Java ist

Bei der Garbage Collection handelt es sich um den Prozess der Rückgewinnung des gesamten Laufzeitspeichers durch die Zerstörung ungenutzter Objekte.

Manchmal vergisst der Programmierer, nutzlose Objekte zu zerstören, und der ihnen zugewiesene Speicher wird nicht freigegeben. Es wird immer mehr Systemspeicher verbraucht und irgendwann wird kein weiterer mehr zugewiesen. Solche Anwendungen leiden unter „Speicherlecks“.

Ab einem bestimmten Punkt ist nicht mehr genügend Speicher zum Erstellen neuer Objekte vorhanden und das Programm wird aufgrund von OutOfMemoryError abnormal beendet .

Garbage Collection in Java ist der Prozess, mit dem Java-Programme den Speicher automatisch verwalten. Java-Programme werden in Bytecode kompiliert, der auf der Java Virtual Machine (JVM) ausgeführt wird.

Wenn Java-Programme auf der JVM ausgeführt werden, werden Objekte auf dem Heap erstellt, dem Teil des ihnen zugewiesenen Speichers.

Während eine Java-Anwendung ausgeführt wird, werden darin neue Objekte erstellt. Am Ende werden einige Objekte nicht mehr benötigt. Wir können sagen, dass der Heapspeicher zu jedem Zeitpunkt aus zwei Arten von Objekten besteht.

  • Live – Diese Objekte werden verwendet, sie werden von einer anderen Stelle referenziert.
  • Tot – diese Objekte werden nirgendwo anders verwendet, es gibt keine Verweise darauf.

Der Garbage Collector findet diese nicht verwendeten Objekte und entfernt sie, um Speicher freizugeben.

Die Garbage Collection in Java ist ein automatischer Prozess . Der Programmierer muss die zu löschenden Objekte nicht explizit markieren.

Jede JVM kann ihre eigene Version der Garbage Collection implementieren. Allerdings muss der Collector der Standard-JVM-Spezifikation für den Umgang mit im Heap-Speicher vorhandenen Objekten entsprechen, um nicht erreichbare Objekte zu markieren oder zu identifizieren und sie durch Komprimierung zu zerstören.

Objekterreichbarkeit

Um ein Objekt als lebendig zu erkennen, reicht das Vorhandensein von Links nicht aus. Dies liegt daran, dass einige tote Objekte auf andere tote Objekte verweisen können. Deshalb ist es notwendig, dass unter allen Verweisen auf ein Objekt mindestens einer von einem „lebenden“ Objekt vorhanden sein sollte.

Objekterreichbarkeit

Garbage Collectors arbeiten mit dem Konzept der GC Roots ( Garbage Collection Roots ), um zwischen lebenden und toten Objekten zu unterscheiden. Es gibt 100 % lebende Objekte und von ihnen aus gibt es Links, die andere Objekte animieren und so weiter.

Beispiele für solche Wurzeln:

  • Klassen, die vom Systemklassenlader geladen werden.
  • Live-Streams.
  • Parameter aktuell ausgeführter Methoden und lokaler Variablen.
  • Objekte, die als Monitor für die Synchronisierung verwendet werden.
  • Objekte, die aus irgendeinem Grund aus der Garbage Collection zurückgehalten werden.
  • Der Garbage Collector durchläuft den gesamten Graphen der Objekte im Speicher, beginnend bei diesen Wurzeln und nach Verweisen auf andere Objekte.

Garbage-Collection-Schritte in Java

Die Standardimplementierung der Garbage Collection besteht aus drei Schritten.

1. Markieren Sie Objekte als live

An diesem Punkt muss der Garbage Collector (GC) alle lebenden Objekte im Speicher identifizieren, indem er den Objektgraphen durchläuft.

Wenn es ein Objekt besucht, markiert es es als verfügbar und damit lebendig. Alle Objekte, auf die von den GC-Roots aus nicht zugegriffen werden kann, gelten als Kandidaten für die Garbage Collection.

2. Aufräumen toter Gegenstände

Nach der Markup-Phase ist der Speicherplatz entweder durch lebende (besuchte) oder tote (nicht besuchte) Objekte belegt. Die Bereinigungsphase gibt die Speicherfragmente frei, die diese toten Objekte enthalten.

3. Kompakte Anordnung der verbleibenden Objekte im Speicher

Es ist nicht notwendig, dass die toten Objekte, die in der vorherigen Phase entfernt wurden, nebeneinander liegen. Dadurch besteht die Gefahr, dass der Speicherplatz fragmentiert (halbleer) wird.

Wenn dies jedoch vorgesehen ist, ist es natürlich möglich, den Speicher in dem Moment zu komprimieren, in dem der Garbage Collector tote Objekte entfernt. Der Rest befindet sich in einem zusammenhängenden Block am Anfang des Heaps.

Der Komprimierungsprozess erleichtert die sequentielle Zuweisung von Speicher für neue Objekte.

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