Deep Dive into ZGC: A Modern Garbage Collector in OpenJDK

ZGC is a modern, non-generational, region-based, mostly concurrent, parallel, mark-evacuate collector recently added to OpenJDK. It aims at having GC pauses that do not grow as the heap size increases, offering low latency even with large heap sizes. The ZGC C++ source code is readily accessible in...

Full description

Saved in:
Bibliographic Details
Published inACM transactions on programming languages and systems Vol. 44; no. 4; pp. 1 - 34
Main Authors Yang, Albert Mingkun, Wrigstad, Tobias
Format Journal Article
LanguageEnglish
Published New York, NY ACM 21.09.2022
Subjects
Online AccessGet full text

Cover

Loading…
More Information
Summary:ZGC is a modern, non-generational, region-based, mostly concurrent, parallel, mark-evacuate collector recently added to OpenJDK. It aims at having GC pauses that do not grow as the heap size increases, offering low latency even with large heap sizes. The ZGC C++ source code is readily accessible in the OpenJDK repository, but reading it (25 KLOC) can be very intimidating, and one might easily get lost in low-level implementation details, obscuring the key concepts. To make the ZGC algorithm more approachable, this work provides a thorough description on a high-level, focusing on the overall design with moderate implementation details. To explain the concurrency aspects, we provide a SPIN model that allows studying races between mutators and GC threads, and how they are resolved in ZGC. Such a model is not only useful for learning the current design (offering a deterministic and interactive experience) but also beneficial for prototyping new ideas and extensions. Our hope is that our detailed description and the SPIN model will enable the use of ZGC as a building block for future GC research, and research ideas implemented on top of it could even be adopted in the industry more readily, bridging the gap between academia and industry in the context of GC research.
ISSN:0164-0925
1558-4593
1558-4593
DOI:10.1145/3538532