更快的JVM垃圾回收器:Shenandoah


在本月早些时候的 re:Invent 年度用户大会上,AWS推出了开源Shenandoah垃圾收集器的变体,作为其 OpenJDK 发行版Corretto 的第 17 版的预览。Shenandoah 最初是由 Red Hat 开发的,但最近两家公司的算法的“分代模式”提高了吞吐量并大大减少了暂停时间。
Shenandoah是已有的垃圾回收器ZGC、CMS、G1竞争者,它是 JVM 的第一个并发分代垃圾收集器。
新的垃圾收集器Shenandoah提高了效率,因为它只关注内存中最有可能存在垃圾的地方,从而减少了暂停应用程序以完成清理工作的时间。
 
Java 一直都有自动内存管理。定期 JVM 垃圾收集器会定期遍历内存,以在对象图中找到那些不再被程序引用的丢弃变量和其他位,然后将其删除,从而释放内存。它在当时是革命性的:这种自动化提供了优于 C 和 C++ 等旧语言的优势,在这些语言中,开发人员必须手动释放不再使用的内存,否则会导致安全漏洞。
然而,Java 自动内存管理的缺点是相当大的:为了对可以扔掉和不能扔掉的东西进行排序,垃圾收集器必须完全暂停所有程序线程以清扫内存。这使得该语言不适合某些对时间敏感的关键任务任务并减慢大型 Java 应用程序的速度。
为了减少停机时间,Shenandoah 引入了一种称为分代垃圾收集的新技术。它适用于世代假设:即在大多数情况下,较年轻的对象比较旧的对象更常被丢弃。
Shenandoah 识别出包含新对象的区域,这些对象来自已经至少在一个垃圾收集中幸存下来的对象,这些对象被分成两代——年轻的和年老的——然后更频繁地扫过年轻的对象。因为收集器可以专注于包含最多垃圾的区域,所以它降低了暂停时间,缩短了收集周期,并减少了实现低暂停时间所需的内存量。
在大多数情况下,基于新一代的 Shenandoah 能够将暂停时间减少到几乎无法检测的 10 毫秒以下,整体应用程序吞吐量不到 5%。