一.各个 GC 对比
二.常用的 GC 组合
(1)Serial+Serial Old 实现单线程的低延迟 垃圾回收机制;
(2)ParNew+CMS,实现多线程的低延迟垃 圾回收机制;
(3)Parallel Scavenge和Parallel Scavenge Old,实现多线程的高吞吐量垃圾 回收机制。
三.GC 如何选择
选择正确的 GC 算法,唯一可行的方式就是去尝试,一般性的指导原则:
1. 如果系统考虑吞吐优先,CPU 资源都用来最大程度处理业务,用 Parallel GC;
2. 如果系统考虑低延迟有限,每次 GC 时间尽量短,用 CMS GC;
3. 如果系统内存堆较大,同时希望整体来看平均 GC 时间可控,使用 G1 GC。
对于内存大小的考量: 1. 一般 4G 以上,算是比较大,用 G1 的性价比较高。
2. 一般超过 8G,比如 16G-64G 内存,非常推荐使用 G1 GC
四.GC 总结
到目前为止,我们一共了解了 Java 目前支持的所有 GC 算法,一共有 7 类:
1. 串行 GC(Serial GC): 单线程执行,应用需要暂停;
2. 并行 GC(ParNew、Parallel Scavenge、Parallel Old): 多线程并行地执行垃圾回收, 关注与高吞吐;
3. CMS(Concurrent Mark-Sweep): 多线程并发标记和清除,关注与降低延迟;
4. G1(G First): 通过划分多个内存区域做增量整理和回收,进一步降低延迟;
5. ZGC(Z Garbage Collector): 通过着色指针和读屏障,实现几乎全部的并发执行,几毫 秒级别的延迟,线性可扩展;
6. Epsilon: 实验性的 GC,供性能分析使用;
7. Shenandoah: G1 的改进版本,跟 ZGC 类似。
五.GC 算法和实现的演进路线:
1. 串行 -> 并行: 重复利用多核 CPU 的优势,大幅降低 GC 暂停时间,提升吞吐量。
2. 并行 -> 并发: 不只开多个 GC 线程并行回收,还将 GC 操作拆分为多个步骤,让很多繁重的任务和应用线程一起并发 执行,减少了单次 GC 暂停持续的时间,这能有效降低业务系统的延迟。 3. CMS -> G1: G1 可以说是在 CMS 基础上进行迭代和优化开发出来的,划分为多个小堆块进行增量回收,这样就更进 一步地降低了单次 GC 暂停的时间
4. G1 -> ZGC::ZGC 号称无停顿垃圾收集器,这又是一次极大的改进。ZGC 和 G1 有一些相似的地方,但是底层的算法 和思想又有了全新的突破。