一 点睛
垃圾收集机制是 Java 的招牌能力,极大地提高了开发效率。这当然也是面试的热点。
那么,Java常见的垃圾收集器有哪些?
GC 垃圾收集器是和 JVM 一脉相承的,它是和 JVM 进行搭配使用,在不同的使用场景对应的收集器也是有区别。
二 垃圾回收器发展史
有了虚拟机,就一定需要收集垃圾的机制,这就是 Garbage Collection,对应的产品我们称为 Garbage Collector。
-
1999年随 JDK1.3.1 一起来的是串行方式的 serial GC,它是第一款 GC。ParNew 垃圾收集器是 Serial 收集器的多线程版本。
-
2002年2月26日,Parallel GC 和 Concurrent Mark Sweep GC 跟随 JDK1.4.2 一起发布。
-
Parallel GC 在 JDK6 之后成为 HotSpot 默认 GC。
-
2012年,在 JDK1.7u4 版本中,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、Serial old
并行回收器:ParNew、Parallel Scavenge、Parallel old
并发回收器:CMS、G11
四 7款经典收集器与垃圾分代之间的关系
-
新生代收集器:Serial、ParNew、Parallel Scavenge
-
老年代收集器:Serial old、Parallel old、CMS
-
整堆收集器:G1
五 垃圾收集器的组合关系
-
两个收集器间有连线,表明它们可以搭配使用(7中搭配):Serial/Serial old、Serial/CMS、ParNew/Serial old、ParNew/CMS、Parallel Scavenge/Serial 0ld、Parallel Scavenge/Parallel 01d、G1;
-
其中 Serial old 作为 CMS出现 "Concurrent Mode Failure" 失败的后备预案。
-
红色虚线:由于维护和兼容性测试的成本,在 JDK 8 时将 Serial + CMS、ParNew + Serial old 这两个组合声明为废弃(JEP173),并在 JDK9 中完全取消了这些组合的支持(JEP214),即:移除。
-
绿色虚线:JDK14 中:弃用 Parallel Scavenge 和 Serialold GC 组合(JEP366)。
-
青色虚线:JDK14 中:删除 CMS 垃圾回收器(JEP363)。
为什么要有如此之多的收集器,一个不够吗?因为 Java 的使用场景很多,移动端,服务器等。所以就需要针对不同的场景,提供不同的垃圾收集器,提高垃圾收集的性能。
对各个收集器进行比较,并没有一种放之四海皆准、任何场景下都适用的完美收集器存在,更加没有万能的收集器。所以我们选择的只是对具体应用最合适的收集器。
六 如何查看默认垃圾收集器
-XX:+PrintcommandLineFlags:查看命令行相关参数(包含使用的垃圾收集器)
使用命令行指令:jinfo -flag 相关垃圾回收器参数 进程ID