serial
- 最基本,发展历史最悠久的收集器
- 单线程的收集器
- 使用一个CPU或者一条收集线程去完成垃圾收集工作。
- 进行垃圾回收时,必须暂停其他所有的工作线程,直到它回收结束。
- 针对新生代;
- 采用复制算法;
优点:
- 简单而高效
- 依然是虚拟机运行在Client模式下的默认新生代收集器
缺点:
- 遇到垃圾回收就要停下来等单线程的serial垃圾回收,性能上较差。
参数:
-XX:+UseSerialGC:添加该参数来显式的使用串行垃圾收集器;
serial-old
- 是Serial收集器的老年代版本。
- 单线程收集器
- 使用标记-整理算法
- 给Client模式下的虚拟机使用。
- server
- 在jdk1.5以及之前的版本中与Parallel Scavenge收集器搭配使用。
- 作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用。
parNew
- Serial的多线程版本。
- 其余行为跟Serial一致。(所有可控参数,收集算法,stop the world,对象分配规则,回收策略)
- 许多运行在Server模式下的虚拟机中首选的新生代收集器
- 除了Serial收集器外,目前只有它能与CMS(concurrent mark sweep)收集器配合工作
- -XX:+UseConcMarkSweepGC或者-XX:+UseParNewGC来强制指定它作为新生代收集器。
- -XX:ParallelGCThreads参数来限制垃圾收集的线程数。默认是CPU核数。
parallel Scavenge
- 新生代收集器。
- 复制算法
- 并行的多线程收集器。
- 目的是达到一个可控制的吞吐量(Throughput)–CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)。
- -XX:MaxGCPauseMillis参数控制最大垃圾收集停顿时间。
- < 0的毫秒数
- GC停顿时间缩短是以牺牲吞吐量和新生代空间来换取的。
- -XX:GCTimeRatio参数设置吞吐量的大小。
- 0 < x < 100的整数
- 默认99
- -XX:+UseAdaptiveSizePolicy。
- 这个参数打开后,就不需要手动指定新生代大小(-Xmn),Eden与Suvivor的比例(-XX:SurvivorRadio)、晋升老年代对象大小(-XX:PretenureSizeThreshold)
- GC自适应的调节策略。
- 无法配合CMS收集器配合工作。
parallel old
- parallel Scavenge的老年代版本。
- 使用多线程
- 标记整理算法
- jdk1.6
- 如果新生代选择了parallel Scavenge,老年代除了serial old别无选择
g1
- 面向服务端应用的垃圾收集器。
- 并发与并行。充分利用多CPU,多核环境下的硬件优势,使用多个CPU来缩短Stop The World停顿的时间。
- 分代收集。
- 空间整合。
- 从整体看,采用了标记-整理算法
- 从局部看(两个Region)基于复制算法。
- 可预测的停顿。
- 将整个java堆划分为多个大小相等的独立区域(Region),新生代和老年代不再是物理隔离,它们都是一部分Region的集合。
- 避免整个堆进行全区域的垃圾收集。
- 运作流程:
- 初始标记
- 并发标记
- 最终标记
- 筛选回收
cms
- Concurrent Mark Sweep
- 以获取最短回收停顿时间为目标的收集器。
- 标记-清除算法。
- 初始标记(可达性分析法)
- 并发标记
- 重新标记
- 并发清除
优点:
- 并发收集
- 低停顿
缺点:
- 对CPU资源非常敏感
- 无法处理浮动垃圾,可能出现“Concurrent Mode Failure”失败而导致另一次Full GC的产生。
- 大量空间碎片产生。(-XX:+UseCMSCompactAtFullCollection,-XX:CMSFullGCsBeforeCompaction)