Garbage Collection und Java Virtual Machine: Ein Überblick

Dr. Rainer SawitzkiTrainer Cegos Integrata

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:

Java Code Garbage Collection

Hier erstellen wir zwei Personen, Margit und Hans. Was passiert jedoch, wenn wir das Array, in dem die Personen gespeichert sind, auf null setzen?

Java Code Garbage Collection

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.

Anwendungsprogrammierung mit Java

Zyklische Referenzen und Garbage Collection

Ein interessantes Szenario entsteht, wenn sich zwei Objekte gegenseitig referenzieren. Schauen wir uns das folgende Beispiel an:

Java Code Garbage Collection

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:

Java Code Garbage Collection

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.

Java Erweiterungen I
Effiziente Java-Programmierung

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.

Java Erweiterungen II - Vertiefung
Geschrieben von

Dr. Rainer Sawitzki

Nach seinem Studium der Physik und anschließender Promotion Wechsel in die IT-Branche. Seit mehr als 20 Jahren als Entwickler, Berater und Projektleiter vorwiegend im Bereich Java und JavaScript unterwegs. Parallel dazu in der Entwicklung und Durchführung von hochwertigen Seminaren für Cegos Integrata im Einsatz.
Erfahren Sie mehr
newsletter image

Unser Newsletter für Ihr Weiterkommen

IT, Personalentwicklung und Learning & Development

Jetzt anmelden