Walery Strauch Selbstständig

„Die Wahl eines Garbage Collectors entscheidet, welche Kosten er verursacht. Wer ParallelGC nutzt, hat einen riesigen Aufwand, um die STW-Pausen in der Anwendung zu vermeiden. Bei Shenandoah hingegen reicht es einfach, sich eine stärkere CPU oder zusätzliche Server zu beschaffen.“

OpenJDK bringt mehrere Garbage Collectors mit, wie ParallelGC, CMS und G1. G1 ist der Ersatz für den seit Java 9 als deprecated markierten Concurrent Mark Sweep GC (kurz CMS). Daneben existieren noch drei weitere Garbage Collectors: EpsilonGC, ZGC und Shenandoah. Allerdings werden sie im OpenJDK (Oracle Build) nicht mitgeliefert. Ein Blick auf Shenandoah im Detail lohnt sich jedoch.

Objekte werden auf dem Heap abgelegt, der nicht unendlich groß ist. Nach einer gewissen Zeit würde der Heap volllaufen. Viele der neu angelegten Objekte werden nach einer gewissen Zeit nicht mehr gebraucht. Damit der Heap nicht vollläuft, werden die unbrauchbaren Objekte gelöscht. Genau darin besteht die Aufgabe eines Garbage Collectors. Ein Garbage Collector allein reicht jedoch nicht aus. Zuerst werfen wir deshalb einen Blick auf die einzelnen Garbage Collectors. Danach wird klar, worin sie sich unterscheiden, und warum und wann man den einen oder den anderen einsetzen sollte.

ParallelGC vs. SerialGC

In der ersten Version von Java gab es nur einen Garbage Collector. Damit er seine Arbeit erledigen konnte, wurde die gesamte Java-Anwendung angehalten. Während dieser Pause (Stop the World oder kurz STW) wurde der Heap aufgeräumt und dann die Ausführung fortgesetzt. Angenommen, unsere Anwendung wäre ein Webserver. Während der STW-Pause kann dieser Server keine Anfragen beantworten. Alle Anfragen, die während des Garbage-Collector-Zyklus ankommen, werden erst beantwortet, wenn dieser beendet ist. Die Beantwortung der Anfragen soll ein Webserver übernehmen, die Dauer der STW-Pause hängt von der Heap-Größe ab. Je größer der Heap, desto länger die Pause. Wenn sich die Anwendung nicht in der STW-Pause befindet, läuft sie mit voller Geschwindigkeit. Der hier beschriebene Garbage Collector ist ParallelGC (auch Throughput GC genannt). Er wird nach wie vor mit OpenJDK mitgeliefert, bis Java 8 ist er der Standard-Garbage-Collector.

Es gibt noch den kleinen Bruder von ParallelGC: SerialGC. Der Unterschied zwischen den beiden besteht darin, dass SerialGC mit einem Thread die Aufräumarbeiten erledigt, ParallelGC dagegen mit mehreren. SerialGC wird bei schwachen Rechnern mit einer CPU eingesetzt, weshalb er heute keine Rolle mehr spielt. In diesem Artikel schauen wir deshalb nur auf ParallelGC.

Den vollständigen Artikel lesen Sie in der Ausgabe:

Java Magazin 11.18 - "Java & Kubernetes"

Alle Infos zum Heft
579860415Der Shenandoah Garbage Collector
X
- Gib Deinen Standort ein -
- or -