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.
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:
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.
Es gibt aber auch verschiedene Arten des Garbage Collector die alle ihre eigenen Vor- und Nachteile haben.
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.