Serial-年轻代
- 单线程GC,在进行垃圾收集时,必须暂停其他所有的工作线程,直至收集结束,Stop The World,即必须暂停其他所有的工作线程,直到它收集结束,
- 新生代使用:标记-复制算法,老年代使用:标记-整理算法
- 优点:简单,单线程效率高,对于运行在client模式下的虚拟机而言较好
- 缺点:Stop The World过长
ParNew-年轻代
- 其实就是Serial的多线程版本,除了使用多条线程进行垃圾收集之外,其余都和Serial完全一样。
- 新生代使用:标记-复制算法,老年代使用:标记-整理算法
- 是许多运行在server模式下虚拟机的首要选择,除了serial收集器外,只有它ParNew能与CMS收集器(真正意义上的并发收集器)配合工作
Paraller Scavenge-年轻代
- 使用复制算法
- 并发多线程收集器,目标是达到一个可控的的吞吐量,
- 和ParNew的最大区别是GC自动调节策略,JVM会根据系统的运行状态收集性能监控信息,动态设置这些参数,以提供最优的停顿时间和最高的吞吐量
- server模式下默认GC的方式。
- 停顿时间短,良好的响应速度可以提升用户体验。有自适应调节策略。
Serial Old-老年代
- 是Serial的老年代版本,同样是一个单线程收集器,每次进行回收都很耗时
- 使用标记整理算法
# Parallel Old-老年代
垃圾回收的时候仅执行整个堆压缩,这会导致相当长的暂停时间。
- Parallel Scavenge收集器的老年代版本,多线程
- 使用标记整理算法
CMS-老年代
Cuncurrent Mark Sweep Collector,CMS 使用标记清除算法,不进行压缩。
- 一种以获得最短停顿时间为目标的GC,目前用重视响应速度的服务端上(如BS架构)。
- 使用XX:+UseConcMarkSweepGC指定使用。
- 运作过程:初始标记、并发标记、重新标记、并发清除,收集结束会产生大量空间碎片
优点:①响应时间短
缺点:①对CPU资源很敏感,会导致应用变慢,总吞吐量会降低
G1-分代收集
基础知识
G1 使用标记整理(压缩)算法进行垃圾收集。G1 可以在多处理器上井行执行,充分利用 CPU,以减少暂停时间并提高吞吐量。因此,每次垃圾回收时,G1 都会在用户定义的暂停时间内持续工作以减少碎片,消除了潜在的碎片问题。
G1 可以进行分代收集,既可以收集新生代也可以收集老年代。
G1 不是实时收集器,它是以高概率但不是绝对确定地满足设定的暂停时间目标。G1 会根据之前收集的数据,估计在用户指定的目标时间内可以收集多少个区域。因此,G1 有一个相当准确的区域收集成本模型,并旦它使用该模型来确定要收集哪些区域以及要收集多少区域,同时保持在暂停时间目标内。
推荐使用场景
G1 的第一个重点是为运行需要大堆且 GC延迟有限的应用程序的用户提供解决方案。所以说需要 6GB 或更大的堆大小,以及低于 0.5秒的稳定且可预测的暂停时间。
如果应用程序具有以下的一个或多个特征,那么使用 G1 是一个很好的选择:
- 超过 50% 的Java堆被实时数据占用。
- 对象分配率或提升率差异很大。
- 不需要的长时间垃圾收集或压缩暂停(超过 0.5 到 1秒)