垃圾回收器
1、GC分类与性能指标
1.1、GC分类
-
按线程数分(垃圾回收线程数),可以分为串行垃圾回收器和并行垃圾回收器。
串行回收默认被应用在客户端的Client模式下的JVM中

-
按照工作模式分,可以分为独占式垃圾回收器(Stop the World)和并发式垃圾回收器。

-
按碎片处理方式分,可分为压缩式垃圾回收器(指针碰撞)和非压缩式垃圾回收器(空闲列表)。
-
按工作的内存区间分,又可分为年轻代垃圾回收器和老年代垃圾回收器。
1.2、评估GC的性能指标
-
吞吐量 = 运行用户代码的时间 / ( 运行用户代码的时间 + 内存回收的时间)
吞吐量优先,意味着在单位时间内,STW的时间最短。必然需要降低内存回收的执行频率。 -
垃圾收集开销:吞吐量的补数,垃圾收集所用时间与总运行时间的比例。
-
暂停时间:执行垃圾收集时,程序的工作线程被暂停的时间。
暂停时间优先,意味着尽可能让单次STW的时间最短。只能频繁的执行内存回收 -
收集频率:相对于应用程序的执行,收集操作发生的频率。
-
内存占用:Java堆区所占的内存大小。
-
快速:一个对象从诞生到被回收所经历的时间。
吞吐量、暂停时间、内存占用这三者共同构成一个“不可能三角”,主要抓住两点:吞吐量、暂停时间
现在JVM调优标准:在最大吞吐量优先的情况下,降低停顿时间(在可控的暂停时间内,尽量增加吞吐量)。
2、不同的垃圾回收器概述
2.1、垃圾回收器的发展
有了虚拟机,就一定需要收集垃圾的机制,这就是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上的应用
2.2、7款经典的垃圾收集器及其与垃圾分代的关系
- 串行回收器:Serial、Serial old
- 并行回收器:ParNew、Parallel Scavenge、Parallel old
- 并发回收器:CMS、G1
相关资料:https://www.oracle.com/technetwork/java/javase/tech/memorymanagement-whitepaper-1-150020.pdf

- 新生代收集器:Serial、ParNew、Parallel Scavenge
- 老年代收集器:Serial old、Parallel old、CMS
- 整堆收集器:G1
2.3、垃圾收集器的组合关系

- 两个收集器间有连线,表明可以搭配使用。虚线表示已废除方案。
- Serial Old 作为 CMS 出现“Concurrent Mode Failure” 失败的后备方案。
- (红色虚线)由于维护和兼容性测试的成本,在 JDK8 时将Serial+CMS、ParNew+Serial Old这两个组合声明为Deprecated(JEP173),并在 JDK9 中完全取消了这些组合的支持(JEP214),即:移除。
- (绿色虚线)JDK14 中:弃用ParallelScavenga 和 SerialOld GC 组合(JEP 366)
- (青色虚线)JDK14 中:删除CMS垃圾回收器(JEP 363)
- GC发展阶段:Serial -> Parallel(并行)->CMS(并发)->G1 -> ZGC
2.4、查看默认的垃圾回收器
/**
* -XX:+PrintCommandLineFlags
JVM垃圾回收器深度解析:类别、性能指标与经典选择

本文详细介绍了GC分类、评估指标,包括Serial、ParNew、Parallel、CMS和G1等经典收集器的历史发展、工作原理、性能优劣以及面试要点。掌握这些有助于理解并优化JVM内存管理。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



