magicmarcy.de | Der Garbage Collector in Java - Superheld Müllsammler

Der Garbage Collector in Java - Superheld Müllsammler

12. März 2025 - Lesezeit: 10 Minuten

Vielleicht hast du den Begriff in Zusammenhang mit Java schon einmal gehört: Der Garabage Collector (deutsch: der Müllsammler). "Name ist Programm" könnte man sagen, denn der Garbage Collector (GC) ist eine der wichtigsten Komponenten der Java Virtual Machine (JVM). Er verwaltet den Speicher automatisch, indem er ungenutzte Objekte erkennt und entfernt und somit Speicher freigibt. Dadurch entfällt die Notwendigkeit einer expliziten Speicherfreigabe durch den Entwickler, wie es beispielsweise in C oder C++ der Fall ist.

In diesem Beitrag erkläre ich die rudimentäre Funktionsweise des Garbage Collectors, stelle die verschiedenen GC-Algorithmen vor und zeige ein einfaches Beispiel zur Demonstration. Dies soll hier lediglich als grober Überblick dienen und kein tieferes Wissen vermitteln.

Wie funktioniert der Garbage Collector in Java?

Speicherverwaltung in der JVM

Der Heap-Speicher in Java ist ein Bereich des Arbeitsspeichers, in dem zur Laufzeit Objekte verwaltet werden. Er wird von der JVM dynamisch verwaltet und unterteilt sich in mehrere Bereiche:

  • Young Generation: Enthält neue Objekte. Dieser Bereich ist weiter unterteilt in:
    • Eden Space: Hier entstehen neue Objekte.
    • Survivor Spaces (S0 und S1): Objekte, die eine Garbage-Collection-Phase überleben, werden hier gespeichert.
  • Old Generation (Tenured Generation): Enthält langlebige Objekte.
  • Metaspace: Speichert Klasseninformationen (seit Java 8).

Ablauf der Garbage Collection

  1. Neue Objekte werden im Eden Space angelegt.
  2. Wenn der Eden Space voll ist, wird eine Minor GC durchgeführt, die nicht mehr verwendete Objekte entfernt und übrig gebliebene Objekte in die Survivor Spaces verschiebt.
  3. Objekte, die mehrere GC-Zyklen überleben, werden in die Old Generation verschoben.
  4. Ist die Old Generation voll, wird eine Major GC (auch Full GC) durchgeführt, die Speicher in diesem Bereich freigibt.
  5. Falls der Speicher nach einer Full GC nicht ausreicht, tritt eine OutOfMemoryError-Exception auf.

Beispiel:

Hier ist ein einfaches Beispiel zur rudimentären Beobachtung der Garbage Collection:

public class GarbageCollectorDemo {
    public static void main(String[] args) {
        for (int i = 0; i < 1_000_000; i++) {
         // Erzeugt viele Objekte, die schnell als Muell markiert werden 
new DummyObject();
        }
      

// Manuelle Anforderung einer GC (keine Garantie, dass sie sofort ausgefuehrt wird)
System.gc();
        System.out.println("Garbage Collection angefordert");
    }
}

class DummyObject {
    @Override
    protected void finalize() throws Throwable {
        System.out.println("DummyObject wurde vom Garbage Collector entfernt");
    }
}

In diesem Code erzeugen wir viele Objekte, die direkt wieder zur Garbage Collection anstehen. Die Methode finalize() wird aufgerufen, wenn der GC ein Objekt entfernt.

In diesem Beispiel können wir natürlich nicht genau sehen, wann welches Objekt in welchen Space die Objekte abgelegt oder verschoben werden daher dient das hier lediglich zur Veranschaulichung.

Arten von Garbage Collectors

Es gibt aber auch verschiedene Arten des Garbage Collector die alle ihre eigenen Vor- und Nachteile haben.

  1. Serial Garbage Collector (-XX:+UseSerialGC)
    1. Einfache, einstufige Garbage Collection.
    2. Arbeitet mit einem einzelnen Thread (geeignet für Single-Core-CPUs).
    3. Geeignet für kleine Anwendungen und eingebettete Systeme.
    4. Nachteil: Nicht effizient für Multithreading-Umgebungen.
  2. Parallel Garbage Collector (-XX:+UseParallelGC)
    1. Verwendet mehrere Threads für die Garbage Collection.
    2. Standard-GC bis Java 8.
    3. Vorteil: Bessere Performance auf Multi-Core-Prozessoren.
    4. Nachteil: Stop-the-World-Pausen können auftreten.
  3. CMS (Concurrent Mark-Sweep) Collector (-XX:+UseConcMarkSweepGC)
    1. Arbeitet teilweise parallel mit der Anwendung.
    2. Reduziert Stop-the-World-Pausen.
    3. Nachteil: Höherer CPU-Overhead.
    4. Seit Java 9 als veraltet markiert.
  4. G1 Garbage Collector (G1GC) (-XX:+UseG1GC)
    1. Standard-GC seit Java 9.
    2. Arbeitet mit Regionen anstatt mit klassischen Generationen.
    3. Vorteil: Gute Balance zwischen Performance und geringen Pausenzeiten.
    4. Nachteil: Kann in bestimmten Szenarien langsamer sein als ParallelGC.
  5. Z Garbage Collector (ZGC) (-XX:+UseZGC)
    1. Minimalste GC-Pausen, auch bei sehr großen Heaps (bis zu 16 TB).
    2. Vorteil: Sehr geringe Latenzzeiten (Pausen meist unter 10ms).
    3. Nachteil: Noch nicht für alle Szenarien optimiert.
  6. Shenandoah Garbage Collector (-XX:+UseShenandoahGC)
    1. Reduziert Stop-the-World-Pausen durch paralleles Markieren und Aufräumen.
    2. Entwickelt von Red Hat, besonders für latenzkritische Anwendungen.

Vergleiche des Garabage Collectors

GC Typ Standard Hauptvorteil Hauptnachteil
Serial GC Kleine Java-Programme Einfach und effizient auf Single-Core Langsam für Multithreading
Parallel GC Java 8 Hohe Durchsatzleistung Stop-the-World-Pausen
CMS GC - Redizierte Pausenzeiten CPU-intensiv, veraltet
G1 GC Java 9+ Gute Balance zwischen Pausen und Performance Langsamer als Parallel GC in manchen Fällen
ZGC Java 11+ Sehr geringe Pausenzeiten Experimentell in früheren Versionen
Shenandoah Java 12+ Parallelisierung der GC-Pausen Hoher CPU-Bedarf

Der Garbage Collector ist also mit der wichtigste Teil der JVM und aus dem Programmieralltag - gerade in intensiven Anwendungen - nicht wegzudenken. Grundsätzlich hast du damit in der Regel aber nichts zu tun, denn der GC funktioniert auch ohne, dass du etwas tun musst. Einer der entscheidenden Vorteile bei der Verwendung von Java als Programmiersprache.

Kanntest du davon schon etwas oder hast davon bereits gehört? Lass mich gern an deinen Erfahrungen in den Kommentaren teilhaben.

Es wurden noch keine Kommentare verfasst, sei der erste!

Support

Wenn du mich und meine Arbeit unterstützen möchtest, freue ich mich sehr über eine kleine Aufmerksamkeit in Form eines Kaffees ;-)



Weitere Informationen, wie du mich und meine Arbeit unterstützen kannst, findest du hier.