✅项目中如何选择垃圾回收器?为啥选择这个?
典型回答
✅新生代和老年代的垃圾回收器有何区别?
上文中介绍常见的垃圾回收器,其中包括:
- 串行垃圾回收器(Serial Garbage Collector) 如:Serial GC, Serial Old
- 单线程垃圾收集器,适用于单核机器。
- 暂停时间较长,不适用于多核环境和大内存应用。
- 并行垃圾回收器(Parallel Garbage Collector) 如:Parallel Scavenge,Parallel Old,ParNew
- 多线程垃圾收集器,适用于多核机器。适合批处理、后台作业等暂停时间不敏感的应用。
- 暂停时间较长,不适合需要低延迟的应用。
- 并发标记扫描垃圾回收器(CMS Garbage Collector)
- 低延迟垃圾收集器,适合需要响应时间较短、高响应性要求的应用。
- 容易产生碎片,可能需要Full GC进行碎片整理,Full GC时会有较长暂停。
- G1垃圾回收器(G1 Garbage Collector,JDK 7中推出,JDK 9中设置为默认)
- 设计用于替代CMS,适合大内存、多核环境。较低的暂停时间,能够预测性地控制暂停时间,适合大数据量应用。
- ZGC垃圾回收器(The Z Garbage Collector,JDK 11 推出)、Shenandoah GC(JDK 12 推出)
- 超低延迟垃圾收集器,适用于超大堆内存。暂停时间通常在10ms以下,适合对响应时间有极高要求的应用。
- 目前只支持较新的JDK版本,可能存在一些不成熟的特性。
综上,在进行选择的时候,按照以下步骤:
1、根据机器情况判断,如果是单核机器,或者内存较小的机器,则选择Serial GC。
2、根据业务类型判断,看你的应用更在意的是吞吐量还是 STW 的时长。比如批处理任务的应用,更在意的就是吞吐量,而实时交易系统,更在意的就是 STW 的时长。
3、根据机器分配的堆内存大小进行判断,一把来说,我们认为至少达到4G 以上才可以用 G1、ZGC 等,通常要比如超过8G、16G 这样效果才更好。
4、根据 JDK 版本进行判断,不同的版本支持的垃圾收集器不一样。
可以参考以下的选择方式(但是,并不绝对,尤其是 ZGC 和Shenandoah GC 的选择,其实还是要慎重,毕竟他们的稳定性各方面还有待验证):

原文: https://www.yuque.com/hollis666/xkm7k3/fykv0mt786qx8ifa