基于JDK1.7 update 14之后的HotSpot虚拟机的垃圾收集器。
1. Serial收集器
Client模式下的默认新生代垃圾收集器。
- 单线程、单CPU
- STW
- 简单高效
2. ParNew收集器
Serial收集器的多线程版本,Server模式下虚拟机新生代垃圾收集器。
- 多线程
目前为止,只有前面这两种垃圾收集器能够与CMS收集器(并发,垃圾收集线程和用户线程几乎同时进行)配合工作。使用CMS时新生代收集器只能选择ParNewh或者Serial收集器中的一个。ParNew收集器也是使用-XX:+UseConcMarkSweepGC选项后的默认新生代收集器,也可以使用-XX:UseParNewGC选项强制指定他。
注:并发和并行
- 并发:指用户线程与垃圾收集线程同时执行(但不一定是并行执行,可能会交替执行),用户程序继续运行,而垃圾收集程序运行于另一个CPU上。
- 并行:指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。
- 单线程中ParNew不比Serial好。
- -XX:ParallelGCThreads可以限制垃圾收集的线程数。
3. Parallel Scavenge收集器(吞吐量优先)
并行的多线程新生代垃圾收集器,注重吞吐量(运行用户代码所需时间/(运行用户代码所需时间+垃圾收集时间))
- 控制最大垃圾收集停顿时间 -XX:MaxGCPauseMillis
- 直接设置吞吐量大小 -XX:GCTimeRatio(0-100)
注:
- GC停顿时间缩短是牺牲吞吐量和新生代空间换取的
- -XX:UseAdaptiveSizePolicy自动配置参数细节,GC自适应调节策略,只需要把基本属性设置好(-Xmx),然后使用XX:MaxGCPauseMillis和XX:GCTimeRatio给虚拟机设立一个优化目标,具体细节就交给虚拟机进行处理。
4. Serial Old收集器
Serial收集器的老年代版本,Client模式下虚拟机的使用
- 单线程
- 标记-整理
- JDK1.5前与Parallel Scavenge搭配使用
- CMS的后备方法,并发收集发生Concurrent Mode Failure时使用
注:
- safePoint安全点进行STW
- 单线程老年代收集器在Server端无法充分利用服务器多CPU的处理能力
5. Parallel Old收集器
Parallel Scavenge的老年代版本,JDK1.6之后才出现
- 多线程
- 标记-整理
注: - 注重吞吐量以及CPU资源敏感的场合,都可以使用Parallel Scavenge和Parallel Old的应用组合
6. CMS收集器
Concurrent Mark Sweep(并发标记-清除)获取最短回收停顿时间为目标的收集器
- 4个基本步骤:
- 初始标记-CMS initial mark(需STW)标记GC Roots能直接关联到的对象
- 并发标记-CMS Concurrent mark GC Roots Tracing的过程
- 重新标记-CMS remark(需STW)修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录
- 并发清除-CMS Concurrent sweep
- 并发收集
- 低停顿
注:
- 也称作并发低停顿收集器(Concurrent Low Pause Collector)
- 3个明显缺点:
- CMS对CPU资源特别敏感。默认启动的回收线程数是(CPU数量+3)/4
- CMS收集器无法处理浮动垃圾,可能出现Concurrent Mode Failure失败而导致另一次Full GC的产生
- 产生空间碎片(不过默认提供了一个(默认开启)参数-XX:UseCMSCompactAtFullConllection自动进行)
7*. G1(Gabage First)收集器
面向服务端应用的收集器
- 并行与并发:充分利用CPU、发挥多核环境下的硬件优势,使用多个CPU(CPU或者CPU核心)来缩短STW时间。
- 分代收集
- 空间整合:不会因为无法找到连续的内存空间而提前触发下一次GC
- **可预测的停顿:**建立了可预测停顿时间的模型,能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不超过N毫秒。
- 它将整个Java堆划分为多个大小相等的独立区域(Region),新生代和老年代都是一部分Region(不需要连续)的集合。
- 有计划的避免在Java堆中进行全区域的垃圾收集。
- 后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region(Gabage First的由来)
- Region之间的对象引用以及其他收集器中新生代与老年代之间的对象引用,虚拟机都是使用Remembered Set来避免堆扫描的。G1中每个Region都有对应的Remembered Set
G1收集器的运作可划分为几个步骤:
- 初始标记-Initial Marking(需STW,时间很短)
- 并发标记-Concurrent Marking
- 最终标记-Final Marking(需STW,但可并行)
- 筛选回收-Live Data Counting And Evaluation