垃圾回收的各种分类& 垃圾收集器的组合关系
垃圾回收的各种分类
垃圾收集器的分类
- 按线程数分类: 分为单核(串行收集器)和多核(并行收集器)
- 单核 CPU中适合使用串行收集器
- 多核 CPU中适合使用并行收集器
两种收集器共同点都是采用独占式, 也就是回收时都会 STW
- 按工作模式分类: 分为独占式(串行& 并行)垃圾收集器和并发式垃圾收集器
- 独占式垃圾收集器, 一旦开始回收, 会将所有的用户线程 STW, 直到结束
- 并发式垃圾收集器是收集器与应用程序线程交替工作, 以尽可能减少应用程序的停顿时间
- 按碎片处理方式分类: 分为压缩式垃圾收集器和非压缩式垃圾收集器
- 按内存区间分类: 分为新年代, 老年代垃圾收集器
- 按性能指标分类:
-
吞吐量(throughput)是指运行用户代码的时间, 在 CPU的总消耗时间的比值 公式为:
吞吐量 = 运行用户代码的时间 / (运行用户代码的时间 + 垃圾回收的时间)
* 吞吐量优先, 一般意味着垃圾回收相对不频繁, 所以一次回收的垃圾会更多, 因此用户线程暂停的时间会更长, 由此导致相应时间相对慢
* 相对于相应时间优先的程序, 剩了线程间频繁切换的性能消耗, 所以程序的运行速度会更快
-
暂停时间(pause times)是指垃圾回收时用户线程暂停的时间
* 暂停时间优先约等于相应时间优先, 就是相对吞吐量优先的程序垃圾回收更频繁
* 每次垃圾回收时间比较短, 所以程序暂停的时间短, 因此用户交互相应快
-
内存占用: 堆中所占的内存大小
* 值得注意的是大的内存空间, 也会导致暂停时间加长, 因为触发回收的条件会更宽松或面积大了需要扫描垃圾的范围更广
7款经典收集器
垃圾收集器 | 类型 | 作用域 | 使用算法 | 特点 | 适用场景 |
---|---|---|---|---|---|
Serial | 串行回收 | 新生代 | 复制算法 | 响应速度优先 | 适用于单核 CPU环境下的 Client模式 |
Serial Old | 串行回收 | 老年代 | 标记-压缩算法 | 响应速度优先 | 适用于单核 CPU环境下的 Client模式 |
ParNew | 并行回收 | 新生代 | 复制算法 | 响应速度优先 | 多核 CPU环境中 Server模式下与 CMS配合使用 |
Parallel Scavenge | 并行回收 | 新生代 | 复制算法 | 吞吐量优先 | 适用于后台运算, 而交互少的场景 |
Parallel Old | 并行回收 | 老年代 | 标记-压缩算法 | 吞吐量优先 | 适用于后台运算, 而交互少的场景 |
CMS(Concurrent Mark-Sweep) | 并发回收 | 老年代 | 标记-清除算法 | 响应速度优先 | 适用于B/S业务, 也就是交互多的场景 |
G1(Garbage-First) | 并发,并行回收(此收集器后期优化后并行方式同时存在) | 新生代& 老年代(整堆收集器) | 复制算法& 标记-压缩算法 | 响应速度优先 | 面向服务端的应用 |
组合关系
新年代 | 老年代 | 其它 |
---|---|---|
Serial | Serial Old | |
Serial | CMS | 当 CMS回收失败时, 备选 Serial Old GC |
ParNew | Serial Old | |
ParNew | CMS | 当 CMS回收失败时, 备选 Serial Old GC |
Parallel Scavenge | Serial Old | |
Parallel Scavenge | Parallel Old | |
G1 | G1 |
* 注: 当老年代配了 CMS收集器时, 如果内存使用率超过了一定的比例, 系统会抛出 Concurrent Mode Failure, 此时会自动采用 Serial Old收集器做 Full GC
红色虚线
在 Jdk8时, 将Serial与 CMS的组合
和ParNew与 Serial Old的组合
声明为废弃, 并在 Jdk9时完全弃用了黄色虚线
在 Jdk14时, 弃用了 Parallel Scavenge与 Serial Old的组合绿色虚线
在 Jdk14时, 完全弃用了 CMS垃圾收集器
近期垃圾收集器发展过程
- Jdk1.7u4开始全面支持 G1垃圾收集器
- Jdk9时 G1成为了, 默认的垃圾收集器, 替代了 CMS. (CMS声明为废弃)
- Jdk10时 G1垃圾收集器, 实现了并行性来改善了最坏情况下的延迟
- Jdk11时引入了 Epsilon垃圾收集器, 又称为 No-Op(无操作)收集器. 同时, 引入了 ZGC(The Z Garbage Collector), Oracle公司的可伸缩的低延迟垃圾收集器
- Jdk12时增强了 G1垃圾收集器, 自动返回未用的堆内存给操作系统. 同时, 引入 OpenJDK引入了, 红帽公司开发的 Shenandoah GC低延迟垃圾收集器(试验性阶段)
- Jdk13时增强了 ZGC, 自动返回未用堆内存给操作系统
- Jdk14时完全弃用了 CMS垃圾收集器(如果显式设置会提示警告, 但不会中断. 而会自动选择默认收集器就是 G1). 扩展了 ZGC在 MacOS和 Windows上的应用
如果您觉得有帮助,欢迎点赞哦 ~ 谢谢!!