JVM(十五)垃圾回收器概述
1 垃圾回收器概述
- 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现
- 由于JDK版本的高速迭代,Java发展至今已经衍生了众多的GC版本
- 从不同的角度分析垃圾收集器,可以将GC分为不同的类型
2 垃圾回收器分类
-
按照线程数分,可以分为
串行垃圾回收器
和并行垃圾回收器
串行回收指的是同一时间段内只有一个CPU用于执行垃圾回收操作,同时工作线程被暂停直至垃圾回收结束。
在一些单CPU处理器和较小的应用内存的硬件平台不是特别优越的场合,串行回收器的性能表现可以超过并行回收器和并发回收器(线程切换造成性能消耗)。所以串行回收被应用在客户端Client模式下的JVM中。当然在一些并发能力较强的CPU上,并行回收器产生的停顿时间要低于串行回收器
并行收集可以运行多个CPU用于执行垃圾回收,因此提高了应用的吞吐量,不过并行回收和串行回收一样采用了独占式,使用了STW机制
-
按照工作模式分,可以分为
并发垃圾回收器
和独占式垃圾回收器
并发垃圾回收器
会与应用程序线程
交替执行,以尽可能地减少应用程序的停顿时间独占式垃圾回收器
一旦运行,就会运行应用程序中的所有用户线程,直到垃圾回收线程完全结束
-
按照碎片处理方式来分,可以分为
压缩式垃圾回收器
和非压缩式垃圾回收器
压缩式垃圾回收器
在回收完成之后,对存活对象进行压缩整理,消除回收后的内存碎片非压缩式垃圾回收器
不会进行这一步操作
-
按工作的内存区间划分,分为
老年代垃圾回收器
和新生代垃圾回收器
3 GC的性能指标
- 吞吐量:运行用户代码的时间占总运行时间的比例
- 总运行时间=运行用户代码的时间+内存回收的时间
- 垃圾收集开销:吞吐量的补数,垃圾收集所用时间与总运行时间的比例
- 暂停时间:为了执行垃圾收集,用户线程被暂停的时间
- 收集效率:相对于应用程序的执行,收集操作发生的概率
- 内存占用:Java堆所占内存的大小
- 快速响应:一个对象从诞生到被回收所经历的时间
吞吐量、暂停时间、内存占用共同构成了一个不可能三角,三者的总体表现会随着技术进步越来越好,但是一款优秀的垃圾回收器最多满足其中的两项。且随着硬件的进步内存占用越来越被容忍,应该主要抓住剩余的两点。
4 垃圾回收器的发展迭代史
- 1999年随着JDK1.3.1一起发行的是串行方式的
Serial GC
,它是第一款GC,ParNew垃圾收集器
是Serial GC的多线程版本 - 2002年
Parallel GC
和Concurrent Mark Sweep(CMS) GC
随着jdk1.4.2一起发布 Parallel GC
在JDK6之后成为HotSpot虚拟机的默认GC- 2012年,在JDK1.7中
G1
可用 - 2017年,JDK9中
G1
变为默认的垃圾收集器,替代了CMS
- 2018年3月,JDK10中的
G1
垃圾收集器实现了并行性来改善最坏情况下的延迟 - 2018年9月,JDK11发布,引入
Epsilon GC
,又称作“No-Op”(无操作)垃圾收集器。同时引入ZGC
(可伸缩的低延迟垃圾收集器) - 2019年3月,JDK12发布,增强
G1
,使得能够自动返还未用堆内存给操作系统。同时引入Shenandoah GC
(低停顿时间的GC) - 2019年3月,JDK13发布,增强ZGC,能够自动返还未用堆内存给操作系统
- 2020年3月,JDK14发布,删除CMS垃圾回收器,扩展ZGC在MacOS和Windows上的应用
总结为七种经典的垃圾收集器:
- 串行垃圾回收器:Serial、Serial Old
- 并行垃圾回收器:ParNew、Parallel Scavenge、Parallel Old
- 并发垃圾回收器:CMS、G1
七种垃圾回收器与垃圾分代之间的关系:
- 新生代收集器:Serial GC、Parallel Scavenge GC、ParNew
- 老年代收集器:Serial Old GC、Parallel Old GC、CMS
- 整堆收集器:G1
5 垃圾回收器的组合关系:
- 实现相连的垃圾回收器表示可以搭配使用:
Serial GC
-Serial Old GC
ParNew GC
-CMS GC
Parallel Scavenge GC
-Parallel Old GC
- 还有一条
CMS GC
-Serial Old GC
表示CMS出现“Concurrent Mode Failure”
后的备选方案
- (红色虚线)为了维护和兼容性测试的成本,在jdk1.8中将
Serial GC
-CMS GC
的组合以及ParNew GC
-Serial Old GC
组合废弃了,在JDK9中进行了移除 - (绿色虚线)JDK14弃用了
Parallel Scavenge GC
-Serial Old GC
的组合 - (青色虚线)JDK14删除了
CMS GC
上面红色虚线的“维护和兼容性测试的成本”,主要是指的单线程垃圾收集器和多线程垃圾收集器同步工作的成本
Parallel Scavenge GC并没有和同为并行垃圾收集器的CMS配合工作,而ParNew可以的原因是Parallel Scavenge GC、Parallel Old GC所使用的架构和其他的垃圾收集器均不同
6 查看默认的垃圾回收器
-XX:+PrintCommandLineFlags
:查看命令行相关参数(包括垃圾收集器)- 使用命令行指令:
jinfo -flag 相关垃圾回收器参数 进程ID