13_垃圾回收器展望
13.1_垃圾回收器的新发展
GC 仍然处于飞速发展之中,目前的默认选项 G1 GC 在不断的进行改进。
很多我们原来认为的缺点,例如串行的 Full GC、Card Table 扫描的低效等,都已经被大幅改进。
例如,JDK 10 以后,Full GC 已经是并行运行,在很多场景下,其表现还略优于 Parallel GC 的并行 Full GC 实现。
即使是S erial GC,虽然比较古老,但是简单的设计和实现未必就是过时的,它本身的开销,不管是 GC 相关数据结构的开销,还是线程的开销,都是非常小的,所以随着云计算的兴起,在 Serverless 等新的应用场景下,Serial GC 找到了新的舞台。
比较不幸的是 CMS GC, 因为其算法的理论缺陷等原因,虽然现在还有非常大的用户群体,但在 JDK9 中已经被标记为废弃,并在 JDK14 版本中移除。
13.2_JDK 11 起增加的 GC
JDK11 新特性
-
[JEP318 : Epsilon: A No - Op Garbage Collector (Epsilon 垃圾回收器,"No - Op (无操作) "回收器)](http: / /openidk.java.net/ieps/318)
只做内存分配,不进行垃圾回收
-
JEP333: ZGC: A Scalable Low - Latency ;Garbage Collector (Experimental) ( ZGC:可伸缩的低延迟版回收器,处于试验性阶段)
Open JDK12 的 Shenandoah GC:低停顿时间的 GC (实验性)
-
现在G1回收器已成为默认回收器好几年了。
-
我们还看到了引入了两个新的收集器: ZGC ( JDK11出现)和 Shenandoah(Open JDK12) 。
-
主打特点:低停顿时间
-
Shenandoah,无疑是众多 GC 中最孤独的一个。是第一款不由 Oracle 公司团队领导开发的 HotSpot 垃圾收集器。不可避免的受到官方的排挤。比如号称 OpenJDK 和 OracleJDK 没有区别的 Oracle 公司仍拒绝在OracleJDK12 中支持 Shenandoah。
-
Shenandoah 垃圾回收器最初由 RedHat 进行的一项垃 圾收集器研究项目 PauselessGC 的实现,旨在针对 JVM上 的内存回收实现低停顿的需求。在 2014 年贡献给 OpenJDK。
-
Red Hat 研发 Shenandoah 团队对外宣称,Shenandoah 垃圾回收器的暂停时间与堆大小无关,这意味着无论将堆设置为 200MB 还是 200GB,99.9% 的目标都可以把垃圾收集的停顿时间限制在十毫秒以内。不过实际使用性能将取决于实际工作堆的大小和工作负载。
- 这是 RedHat 在 2016 年发表的论文数据,测试内容是使用 ES 对 200GB 的维基百科数据进行索引。从结果看:
- 停顿时间比其他几款收集器确实有了质的飞跃,但也未实现最大停顿时间控制在十毫秒以内的目标。
- 而吞吐量方面出现了明显的下降,总运行时间是所有测试收集器里最长的。
- Shenandoah GC 的弱项:高运行负担下的吞吐量下降。
- Shenandoah GC 的强项:低延迟时间。
革命性的 ZGC
与 Shenandoah 目标高度相似,在尽可能对吞吐量影响不大的前提下,实现在任意堆内存大小下都可以把垃圾收集的停顿时间限制在十毫秒以内的低延迟。
《深入理解Java虚拟机》一书中这样定义 ZGC: ZGC 收集器是一款基于 Region 内存布局的,(暂时)不设分代的,使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记 - 压缩算法的,以低延迟为首要目标的一款垃圾收集器。
ZGC 的工作过程可以分为 4 个阶段:并发标记 一> 并发预备重分配 一> 并发重分配 一> 并发重映射等。
ZGC 几乎在所有地方并发执行的,除了初始标记的是 STW 的。所以停顿时间几乎就耗费在初始标记上,这部分的实际时间是非常少的。
测试数据如图:
![](https://i-blog.csdnimg.cn/blog_migrate/cefec62a9ce8a86499b9e8ceaa131028.jpeg)
在 ZGC 的强项停顿时间测试上,它毫不留情的将 Parallel、G1 拉开了两个数量级的差距。无论平均停顿、95% 停顿、99% 停顿、99. 9% 停顿,还是最大停顿时间,ZGC 都能毫不费劲控制在 10 毫秒以内。
JDK14 新特性
JEP 364: ZGC 应用在 macOS 上
JEP 365: ZGC 应用在 Windows 上
-
JDK14 之前,ZGC 仅 Linux 才支持
-
尽管许多使用 ZGC 的用户都使用类 Linux 的环境,但在 Windows 和 macOS 上,人们也需要 ZGC 进行开发部署和测试。许多桌面应用也可以从 ZGC 中受益。因此,ZGC 特性被移植到了 Windows 和 macOs 上。
-
现在 mac 或 Windows 上也能使用 ZGC 了,示例如下:
-XX: +UnlockExperimentalVMOptions -XX: +UseZGC
13.3_其他垃圾回收器 AliGC
AliGC 是阿里巴巴 JVM 团队基于 G1 算法,面向大堆(LargeHeap)应用场景。指定场景下的对比:
当然,其他厂商也提供了各种独具一格的GC实现,例如比较有名的低延迟GC:[Zing](