目录
1. Serial收集器
针对新生代,串行GC
是最基本、历史最优解的垃圾回收器
-
特点
- 使用复制算法
- 单线程 -> 只使用一个CPU或一条线程区完成垃圾收集工作
- 进行垃圾回收时,必须暂停其他工作线程,直到垃圾回收完毕
- 场景
- 虚拟机在Client模式下的默认新生代收集器
- 优点
- 与其他单线程收集器相比,专心做垃圾回收,简单高效
2. ParNew收集器
针对新生代,串行GC
是Serial的多线程版本,除了使用多线程收集新生代外,其余与Serial一样。
- 特点
- Serial的多线程版本,同Serial
- 场景
- 虚拟机在Server模式下的首选新生代收集器(除了Serial收集器,唯一能和CMS收集器配合工作的收集器)
- 优点
- 虽然由于存在线程交互的开销,没有Serial收集效果好;但是充分的利用CPU资源,回收效率高于单线程
3. Parallel Scavenge收集器
针对新生代,并行GC
-
特性
-
使用两个参数控制吞吐量
-
XX:MaxGCPauseMillis 控制大的垃圾收集停顿时间
-
XX:GCRatio 直接设置吞吐量的大小
-
-
-
场景
-
停顿时间短 -> 响应速度快 -> 与用户交互频繁
-
吞吐量高 -> 高效利用CPU,运算快 -> 后台运算较大,交互少
-
- 优点
- 达到一个可控制的吞吐量
- 具有自适应调节策略
- 当设置参数 XX:+UseAdaptiveSizePolicy后,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整一些参数(新生代的大小、3个区域的比例等)来达到最大的吞吐量或者最合适的停顿时间。
4. Serial Old收集器
针对老年代,串行GC
- 特点
- 类似于Serial收集器,针对老年代
- 使用标记-整理算法
- 场景
- 主要用于虚拟机的Client模式
- 在Server模式下,与Parallel Scavenge收集器搭配使用或作为CMS收集器的PlanB(在并发收集发生 Concurrent Mode Failure时使用)
5. Parallel Old收集器
针对老年代,并行GC
- 特点
- 类似于Parallel Scavenge收集器,针对老年代
- 使用标记-整理算法
- 场景
- 在注重吞吐量和CPU资源敏感的场合,与Parallel Scavenge搭配使用
- 优点
- 与Parallel Scavenge搭配使用时,吞吐量超给力
6. CMS收集器
针对老年代,并发GC
- 特点
- 尽可能地缩短垃圾收集时用户线程的停顿时间,提高响应速度,用户体验更好
- 使用标记-清除算法
- 工作步骤
- 初始标记
- 利用可达性分析算法标记能够直接关联的对象(其他工作线程暂停)
- 并发标记
- GC Roots Tracing
- 重新标记
- 修正并发标记期间,因用户程序继续运行而产生变动的标记。停顿之间较长,但比并发标记短(其他工作线程暂停)
- 并发清除
- 清除对象
- 初始标记
- 由于初始标记和重新标记两个需要其他线程暂停的过程较短,我们可以认为,总体上CMS收集器的内存回收是并发的。
- 优点
- 并发收集
- 停顿时间短(低延时)
- 缺点
- 对CPU资源非常敏感,并发会占用一部分线程导致应用程序变慢
- 采用标记-清除算法,内存碎片化
- 无法处理浮动垃圾,需要将Serial所谓PlanB
- 浮动垃圾:并发清理过程中用户线程产生的垃圾,由于在标记过程之后,无法进行回收。
7. G1收集器
全区域,该垃圾回收器在新生代和老年代两个区域同时回收垃圾。
- 特点
- 将堆划分为多个区域块,并行进行垃圾回收
- 整体来看,采用标记-整理算法;局部来看,采用复制算法
- 工作步骤
- 新生代
- 采用复制算法,将Eden和Survivor中的对象复制到新的Survivor中
- 老年代
- 初始标记
- 在G1触发minor gc时,开始老年代的初始标记,利用可达性分析算法标记(其他工作线程暂停)
- 并发标记
- 在CMS的基础上,计算每个区域的对象存活率,将Tenured区域中存活率很小的对象回收。
- 最终标记
- 采用SATB算法做到CMS中重新标记的工作
- 筛选回收
- 在G1触发minor gc时,挑出对象存活率低的区域进行回收
- 初始标记
- 新生代
- 优点
- 低延时效果好