Garbage Collection und Java Virtual Machine: Ein Überblick
In Java werden alle erzeugten Objekte im Heap-Speicher der JVM (Java Virtual Machine) abgelegt. Da dieser Speicher jedoch begrenzt ist, müssen Objekte, die nicht mehr benötigt werden, automatisch entfernt werden. Dies übernimmt die Garbage Collection (GC) – die „Müllabfuhr“ von Java. Sie entfernt alle nicht mehr referenzierten Objekte aus dem Speicher und sorgt so dafür, dass der Heap nicht überläuft.
Warum ist Garbage Collection wichtig?
Durch unachtsame Programmierung kann es zu sogenannten Memory Leaks (Speicherlecks) kommen. Ein Memory Leak entsteht, wenn ein Objekt nicht mehr benötigt wird, aber weiterhin von anderen Objekten referenziert wird. Dies führt dazu, dass der Speicherplatz nicht freigegeben wird, obwohl das Objekt eigentlich nicht mehr gebraucht wird.
Beispiel für Garbage Collection in Java
Schauen wir uns ein einfaches Beispiel an, um den Prozess der Garbage Collection besser zu verstehen:
Hier erstellen wir zwei Personen, Margit und Hans. Was passiert jedoch, wenn wir das Array, in dem die Personen gespeichert sind, auf null setzen?
In diesem Fall wird die Referenz auf Margit entfernt. Der Garbage Collector erkennt dies und entfernt das Objekt Margit aus dem Speicher, da es keine Referenz mehr auf sie gibt.
Wie funktioniert der Garbage Collector?
Der Garbage Collector untersucht, welche Objekte von der aktuellen Methode und dem Stack aus noch erreichbar sind. Objekte, die nicht mehr referenziert werden, werden entfernt. Im obigen Beispiel bleibt Hans im Speicher, weil er weiterhin vom Array referenziert wird. Margit hingegen wird entfernt, da ihre Referenz gelöscht wurde.
Zyklische Referenzen und Garbage Collection
Ein interessantes Szenario entsteht, wenn sich zwei Objekte gegenseitig referenzieren. Schauen wir uns das folgende Beispiel an:
Obwohl Margit und Hans sich gegenseitig referenzieren, entfernt der Garbage Collector beide aus dem Speicher. Der Grund dafür ist, dass keine von ihnen über die main()-Methode erreicht werden kann.
Memory Leaks und wie man sie vermeidet
Speicherlecks entstehen oft durch vergessene Referenzen. Im nächsten Beispiel verwenden wir eine zusätzliche lokale Variable misterX:
Hier wird das Array personen auf null gesetzt, aber die Referenz misterX hält Margit im Speicher. Dadurch bleibt sie bestehen, obwohl sie nicht mehr benötigt wird. Um solche Speicherlecks zu vermeiden, sollten ungenutzte Referenzen explizit auf null gesetzt werden.
Finalize-Methode und moderne Garbage Collection
Früher konnten Entwickler die Methode finalize() überschreiben, die aufgerufen wurde, bevor ein Objekt entfernt wurde. Allerdings war diese Methode problematisch, weil Entwickler nicht wussten, wann oder ob sie überhaupt ausgeführt wird. Seit Java 9 ist finalize() als veraltet (deprecated) markiert und sollte nicht mehr verwendet werden.
Moderne Alternativen sind beispielsweise die Implementierung des AutoCloseable-Interfaces für die ordnungsgemäße Freigabe von Ressourcen. Entwickler sollten sicherstellen, dass sie den Garbage Collector nicht durch fehlerhaften Code blockieren.
Neue Entwicklungen in der Garbage Collection
Mit neueren Java-Versionen (z. B. Java 17) wurden zusätzliche Garbage Collector-Optionen eingeführt, die effizienter arbeiten:
- ZGC (Z Garbage Collector): Dieser GC ist auf geringe Latenzzeiten optimiert und arbeitet effizient bei großen Heaps.
- Shenandoah: Ebenfalls ein GC mit geringen Pausenzeiten, der darauf abzielt, Garbage Collection-Prozesse so unauffällig wie möglich zu gestalten.
- Epsilon: Ein „No-Op“-Garbage Collector, der den Speicher nicht freigibt. Er ist nützlich für Testszenarien, in denen Speicherbereinigung nicht notwendig ist.
Fazit
Die automatische Speicherbereinigung durch die Garbage Collection ist ein essenzieller Bestandteil der Java Virtual Machine. Sie hilft dabei, Speicherlecks zu vermeiden und stellt sicher, dass nicht mehr benötigte Objekte aus dem Heap entfernt werden. Moderne Java-Versionen bieten verschiedene Garbage Collection-Strategien, die für unterschiedliche Anwendungsfälle optimiert sind.
Wer mehr über die Feinheiten der Garbage Collection erfahren möchte, kann dies in unserem Java Erweiterungen II - Vertiefung tun. Hier vertiefen wir Themen wie schwache und starke Referenzen und deren Bedeutung für die Garbage Collection.