在正式介绍垃圾收集器之前,先来唠一唠垃圾收集器一些细枝末节的东西!!!
前文介绍过 垃圾收集算法,如果说它是内存回收的方法论,那么垃圾收集器就是内存回收的实践者。《Java 虚拟机规范》中对垃圾收集器应该如何实现并没有做出任何规定!!
注意:根据上下文 GC 可能表示 Garbage Collection 或者 Garbage Collector,前者为垃圾收集机制,后者为垃圾收集器
1999 年随 JDK1.3.1 一起出现的是串行方式的 Serial 收集器和 Serial Old 收集器,它是第一款垃圾收集器。ParNew 收集器是 Serial 收集器的多线程版本
2002 年 2 月 26 日,Parallel Scaverge 收集器和 Concurrent Mark Sweep (CMS) 收集器跟随 JDK1.4.2 一起发布
Parallel Old 收集器直到 JDK6 才开始提供;Parallel Scaverge / Parallel Old 收集器在 JDK6 之后成为 HotSpot 默认垃圾收集器
2012 年,在 JDK7 Update 4 版本中正式提供了商用的 G1 收集器,此前 G1 一直处于实验阶段
2017 年,JDK9 中 G1 变成默认的垃圾收集器,替代 CMS
2018 年 3 月,JDK10 中 G1 垃圾收集器并行完整垃圾回收,实现并行性来改善最坏情况下的延迟
------------- 分水岭 -------------
2018 年 9 月,JDK11 发布,引入 Epsilon 垃圾收集器,又被称为 No-Op (无操作) 收集器。同时,引入 ZGC:可伸缩的低延迟垃圾收集器 (Experimental)
2019 年 3 月,JDK12 发布,增强 G1,自动返回未用堆内存给操作系统;同时,引入 Shenandoah GC:低停顿时间的GC (Experimental)
2019 年 9 月,JDK13 发布,增强 ZGC,自动返回未用堆内存给操作系统。
2020 年 3 月,JDK14 发布,删除 CMS 垃圾收集器,扩展 ZGC 在 MacOS 和 Windows 上的应用
注意:分水岭上面属于 7 种经典垃圾收集器,分别为:Serial GC、ParNew GC、Parallel Scaverge GC、Serial Old GC、Parallel Old GC、CMS、G1
关于串行、并行、并发的解释可见 垃圾回收的并行与并发
停顿时间:执行一次完整的垃圾收集时,用户线程被暂停的总时间
吞吐量:处理器用于运行用户代码的时间与处理器总消耗时间的比值,计算公式如下:
对比:
本部分的关系是在「按照工作内存区间划分」的基础上进行组合滴!!
JEP 173: Retire Some Rarely-Used GC Combinations
JEP 214: Remove GC Combinations Deprecated in JDK 8
JEP 366: Deprecate the ParallelScavenge + SerialOld GC Combination
JEP 363: Remove the Concurrent Mark Sweep (CMS) Garbage Collector
注意:JDK8 中默认垃圾收集器为 Parallel Scaverge GC + Parallel Old GC;JDK9 中默认垃圾收集器为 G1