Der passende Garbage Collector für deine Anwendung
Die Java HotSpot VM beinhaltet verschiedene Arten von Garbage-Collectoren, die jeweils unterschiedliche Leistungsmerkmale aufweisen.
Der Serial Collector verwendet einen einzelnen Thread für die gesamte Garbage-Collection-Arbeit; dies macht ihn relativ effizient, da kein Kommunikationsaufwand zwischen Threads anfällt. Er eignet sich am besten für Einprozessorsysteme, da er keine Multiprozessor-Hardware nutzen kann – wenngleich er auch auf Multiprozessorsystemen für Anwendungen mit kleinen Datenmengen (bis zu ca. 100 MB) nützlich sein kann. Der Serial Collector wird bei bestimmten Hardware- und Betriebssystemkonfigurationen standardmäßig ausgewählt oder kann explizit über die Option `-XX:+UseSerialGC` aktiviert werden.
Der Parallel Collector, auch als „Throughput Collector“ bekannt, ist – ähnlich wie der Serial Collector – ein generationaler Collector. Der wesentliche Unterschied zwischen dem Serial und dem Parallel Collector besteht darin, dass der Parallel Collector mehrere Threads zur Beschleunigung der Garbage Collection einsetzt. Der Parallel Collector ist für Anwendungen mit mittleren bis großen Datenmengen konzipiert, die auf Multiprozessor- oder Multithreading-Hardware ausgeführt werden. Er lässt sich über die Option `-XX:+UseParallelGC` aktivieren. Die „Parallel Compaction“ ist eine Funktion, die es dem Parallel Collector ermöglicht, Major Collections parallel durchzuführen. Ohne parallele Kompaktierung werden Major Collections von einem einzelnen Thread ausgeführt, was die Skalierbarkeit erheblich einschränken kann. Die parallele Kompaktierung ist standardmäßig aktiviert, wenn die Option `-XX:+UseParallelGC` angegeben wurde; sie lässt sich über die Option `-XX:-UseParallelOldGC` deaktivieren.
Der Garbage-First (G1) Garbage Collector ist ein „Mostly-Concurrent-Collector”. Solche GC’s führen bestimmte rechenintensive Aufgaben parallel zur Anwendung aus. Der G1 GC ist darauf ausgelegt, von kleinen Systemen bis hin zu großen Multiprozessorsystemen mit umfangreichem Arbeitsspeicher zu skalieren. Er bietet die Möglichkeit, ein vorgegebenes Ziel für die Pausenzeit mit hoher Wahrscheinlichkeit einzuhalten und gleichzeitig einen hohen Durchsatz zu erzielen. G1 wird auf den meisten Hardware- und Betriebssystemkonfigurationen standardmäßig ausgewählt oder kann explizit über `-XX:+UseG1GC` aktiviert werden.
Der Z Garbage Collector (ZGC) ist ein skalierbarer Garbage Collector mit geringer Latenz. ZGC führt alle rechenintensiven Aufgaben parallel aus, ohne die Ausführung der Anwendungsthreads zu unterbrechen. ZGC ermöglicht maximale Pausenzeiten von wenigen Millisekunden, allerdings auf Kosten eines gewissen Durchsatzes. Er ist für Anwendungen gedacht, die eine niedrige Latenz erfordern. Die Pausenzeiten sind unabhängig von der Größe des genutzten Heaps. ZGC unterstützt Heap-Größen von 8 MB bis 16 TB. ZGC wird die Option -XX:+UseZGC aktiviert. Im Laufe der letzten Dekade hat sich ZGC von einem experimentellen Feature in JDK 11 zu einem robusten, produktionsreifen Garbage Collector entwickelt, der weltweit kritische Online-Dienste unterstützt. ZGC ist ein „Concurrent Garbage Collector“; das bedeutet, dass alle rechenintensiven GC-Aufgaben parallel zu den Anwendungsthreads ausgeführt werden, was zu Pausenzeiten im Sub-Millisekundenbereich führt. Damit eignet sich ZGC hervorragend für Anwendungen, bei denen kurze Reaktionszeiten entscheidend sind.