Serial
特点:
-
JDK 1.3 开始提供
-
新生代收集器
-
无线程交互开销,单线程收集效率最高
-
进行垃圾收集时需要暂停用户线程
-
适用于客户端,小内存堆的回收
ParNew
特点:
-
是 Serial 收集器的多线程并行版
-
JDK 7 之前首选的新生代收集器
-
第一款支持并发的收集器,首次实现垃圾收集线程与用户线程基本上同时工作
-
除 Serial 外,只有它能与 CMS 配合
Parallel Scavenge
特点:
-
新生代收集器
-
标记-复制算法
-
多线程并行收集器
-
追求高吞吐量,即最小的垃圾收集时间
-
可以配置最大停顿时间、垃圾收集时间占比
-
支持开启垃圾收集自适应调节策略,追求适合的停顿时间或最大的吞吐量
Serial Old
特点:
-
与 Serial 类似,是 Serial 收集器的老年代版本
-
使用标记-整理算法
Parallel Old
特点:
-
JDK 6 开始提供
-
Parallel Scavenge 的老年代版
-
支持多线程并发收集
-
标记-整理算法
-
Parallel Scavenge + Parallel Old 是一个追求高吞吐量的组合
CMS
特点:
-
标记-清除算法
-
追求最短回收停顿时间
-
多应用于关注响应时间的 B/S 架构的服务端
-
并发收集、低停顿
-
占用一部分线程资源,应用程序变慢,吞吐量下降
-
无法处理浮动垃圾,可能导致 Full GC
-
内存碎片化问题
G1
特点:
-
JDK 6 开始实验,JDK 7 商用
-
面向服务端,JDK 9 取代 Parallel Scavenge + Parallel Old
-
结合标记-整理、标记-复制算法
-
首创局部内存回收设计思路
-
基于 Region 内存布局,采用不同策略实现分代
-
不再使用固定大小、固定数量的堆内存分代区域划分
-
优先回收价收益最大的 Region
-
单个或多个 Humongous 区域存放大对象
-
使用记忆集解决跨 Region 引用问题
-
复杂的卡表实现,导致更高的内存占用,堆的 10%~20%
-
全功能垃圾收集器
-
追求有限的时间内最高收集效率、延迟可控的情况下最高吞吐量
-
追求应付内存分配速率,而非一次性清掉所有垃圾内存
-
适用于大内存堆
Shenandoah
特点:
-
追求低延迟,停顿 10 毫秒以内
-
OpenJDK 12 新特性,RedHat 提供
-
连接矩阵代替记忆集,降低内存使用与伪共享问题出现概率
ZGC
特点:
-
JDK 11 新加的实验性质的收集器
-
追求低延迟,停顿 10 毫秒以内
-
基于 Region 内存布局
-
未设分代
-
读屏障、染色指针、内存多重映射实现可并发的标记-整理算法
-
染色指针和内存多重映射设计精巧,解决部分性能问题,但降低了可用最大内存、操作系统受限、只支持 32 位、不支持压缩指针等
-
成绩亮眼、性能彪悍
【Java学习资源】整理推荐
- MAT 分析堆内存快照
- jclasslib 查看类信息
- 增大 MAT 堆内存
- JVM 常用配置参数(Java 8)
- 40 道JVM面试题解答
- JVM 问题排查常用指令
- jvisualvm 远程连接服务器 JVM
- 字节码指令分类
- -verbose:gc 和 -XX:+PrintGC 的区别
- JVM字节码指令表
- 图解 Class 文件结构
- Class 文件的结构
- JVM 故障处理工具列表
- HotSpot 内存分配的主要规则
- 开启 GC 日志
- 垃圾收集器及特点
- JVM垃圾回收算法
- 什么样的 Java 对象会被当垃圾回收?
- 内存溢出复现
- HotSpot VM 中对象的内存分析
- JVM 控制的内存区域
- JVM家族
- Java 的发展史
- 常见 JVM dump 指令
【Java面试题与答案】整理推荐