1. Serial收集器
是一个单线程垃圾收集器,垃圾收集过程过程中会STW,新生代使用标记-复制算法,老年代使用标记-整理算法。
启动参数:-XX:+/-UseSerialGC
,可应用于客户端模式下虚拟机。
2. ParNew收集器
Serial收集器的多线程版本,能与CMS收集器配合工作。
老年代使用CMS后(-XX:+/-UseConcMarkSweepGC
),新生代模式使用ParNew。
启动参数:-XX:+/-UseParNewGC
(JDK9取消),默认开启收集线程数与处理器核心数量相同,可通过-XX:ParallelGCThreads
设置
3. Parallel Scavenge收集器
吞吐量优先的一款垃圾收集器,使用标记-复制算法。
吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 运行垃圾收集时间)
高吞吐量可以最高效的完成程序的运算任务。适合在后台运算而不需要太多交互的分析任务。
内存回收时间上限值:-XX:MaxGCPauseMillis
,值为大于0的毫秒数,收集器尽力保证内存回收时间不超过该值。
垃圾回收时间占比设置:-XX:GCTimeRatio
,值为0到100之间的整数n,允许最大垃圾收集时间为1/(1+n)。
Parallel Scanenge收集器的一个重要特征就是智适应大小调整策略,即:-XX:+/-UseAdaptiveSizePolicy
。JDK8默认开启,具体调节工作由虚拟机完成。
4. Serial Old收集器
Serial收集器的老年代版本,使用标记-整理算法。
可应用于客户端模式下虚拟机。
5. Parallel Old收集器
Parallel Scavenge收集器的老年代版本,使用标记-整理算法,支持多线程并发收集,是一块吞吐量优先的收集器。
6. CMS收集器
以获取最短回收停顿时间为目标的收集器,使用标记-清除算法,是一款并发收集、低停顿的收集器,可以给用户带来良好的交互体验。
包含四个步骤:
- 初始标记
- 标记GC Roots能直接关联到的对象
- 并发标记
- 从GC Roots的直接关联对象开始遍历整个对象图
- 重新标记
- 修正并发标记期间,标记产生变动的那一部分对象的标记记录
- 并发清除
- 删除判断已经死亡的对象
存在三个缺点:
- 对处理器资源敏感
- 默认回收线程数是:(处理器核心数量 + 3)/ 4
- 无法处理浮动垃圾
- 并发标记和并发清除阶段用户线程产生的垃圾无法处理,可能触发Full GC
- CMS需预留老年代一部分空间给用户线程
- 通过参数
-XX:CMSIniatingOccuPancyFrantion
适当调高CMS触发百分比,降低内存回收频率,获得更好的性能 - 参数设置过高可能导致预留的内存无法满足分配新对象的需要,此时,虚拟机将启动后备方案:临时启用Serial Old收集器进行垃圾收集
- 通过参数
- 会产生大量空间碎片
- 可能导致没有连续的空间存放大对象而触发Full DC
- 通过
-XX:CMSFullGCsBeforeCompaction
设置CMS收集器在执行若干次不整理空间的FunnGC后,下一次进入Full GC会先进性碎片整理
7. G1收集器
主要面向服务端应用的垃圾收集器,使用标记-复制算法,采用局部收集的设计思路和基于Region的内存布局形式。
针对配备多颗处理器及大容量内存的机器,以极高概率满足GC 停顿时间要求的同时,还具备高吞吐量性能特征。
G1垃圾收集器不区分新生代和老年代,而是将Java对划分为多个大小相等的Region,JVM最多可以有2048个Region。
一般Region大小等于堆大小除以2048,如:堆大小为4096M,则Region大小为2M。
包含四个步骤:
- 初始标记
- 仅标记GC Roots能直接关联到的对象
- 并发标记
- 从GC Roots的直接关联对象开始遍历整个对象图
- 最终标记
- 修正并发标记期间发生引用变动的对象
- 筛选回收
- 更新Region的统计数据,对各个Region的回收价格和成本进行排序,根据用户期望的停顿时间(
-XX:MaxGCPauseMillis
)来制定回收计划 - 比如:老年代此时有1000个 Region都满了,但是因为根据预期停顿时间,本次垃圾回收可能只能停顿200毫秒,那么通过之前回收成本计算得知,可能回收其中800个Region刚好需要200ms,那么就只会回收800个Region,尽量把GC导致的停顿时间控制在我们指定的范围内。
- 更新Region的统计数据,对各个Region的回收价格和成本进行排序,根据用户期望的停顿时间(
8. ZGC收集器
ZGC是在JDK11加入的具有实验性质的低延迟垃圾收集器。
ZGC采用基于Region的堆内存布局,且可以动态创建和销毁,必须为2MB的整数倍
三个特性:
- 支持TB量级的堆
- 最大GC停顿时间不超过10毫秒
- 停顿时间不会堆的增大而增大