Serial收集器(-XX:+UseSerialGC,复制算法)可以指定年轻代的垃圾回收器
ParNew收集器(-XX:+UseParNewGC,复制算法)
Parallel Scavenge收集器 -- 吞吐量优先收集器(-XX:UseParallelGC,复制算法)
Serial Old收集器(-XX:+UseSerialOldGC,标记-整理算法)
Parallel Old收集器 JDK6 (-XX:+UseParallelOldGC,标记-整理算法)
CMS收集器 并发收集,低停顿(-XX:+UseConcMarkSweepGC,标记-清除算法) 注重服务器的响应速度
执行流程:
- 初始标记:stop-the-world
- 并发标记:并发追溯标记,程序不会停顿
- 并发预清理:查找执行并发标记阶段从年轻代晋升到老年代的对象
- 重新标记:暂停虚拟机,扫描CMS堆中的剩余对象
- 并发清理:清理垃圾对象,程序不会停顿
- 并发重置:重置CMS收集器的数据结构
缺点:
- 会产生空间碎片,CMS提供一个 -XX:+UseCMSCompactAtFullCollection 开关参数(默认是开启的),用于在CMS收集器不要进行FullGC时开启内存碎片的合并整理过程,内存整理的过程是无法并发的,空间碎片问题没有,但停顿时间就会变长。
- 浮动垃圾:由于CMS并发清理阶段用户线程还在运行着,伴随程序运行自然会有新垃圾产生,这部分垃圾得标记过程之后,所以CMS无法在当收集中处理掉他们,只好留待下一次GC清理掉,这一部分垃圾称为浮动垃圾。在jdk1.5默认设置下,CMS收集器当老年代使用了68%的空间就会被激活,可以通过-XX:CMSInitialOccupancyFraction的值来提高触发百分比,在jdk1.6中CMS启动阈值提升到了92%,要是CMS运行期间预留的内存无法满足程序的需要,就会出现”Concurrent Mode Failure“,然后降级临时启用Serial Old收集器进行老年代的垃圾收集,这样停顿时间就很长了,所以-XX:CMSInitialOccupancyFraction设置太高容易导致大量”Concurrent Mode Failure“,并发模式失败。
- 对CPU资源敏感,CMS默认启动的回收线程数是(cpu数量+3)/4。所以CPU数量少会导致用户程序执行速度降低较多。
G1收集器:(-XX:+UseG1GC,复制+标记-整理算法)
好文传送门 --->
因篇幅问题不能全部显示,请点此查看更多更全内容