1、Serial(串行)
Serial 回收器是最基本的 新生代垃圾回收器,是单线程的垃圾回收器。采用的是 复制算法。垃圾清理时,Serial回收器不存在线程间的切换,因此,在单 CPU` 的环境下,垃圾清除效率比较高。它进行垃圾收集的时候需要”Stop the World”直到它的工作结束。
2、SerialOld(串行)
Serial Old回收器是 Serial回收器的老生代版本,单线程回收器,使用 标记-整理算法。在 JDK1.5 及其以前,它常与Parallel Scavenge回收器配合使用,达到较好的吞吐量,另外它也是 CMS 回收器在Concurrent Mode Failure时的后备方案。
Serial和SerialOld示意图
3、ParNew(Serial的多线程版本,并行)
ParNew回收器是在Serial回收器的基础上演化而来的,属于Serial回收器的多线程版本,采用复制算法。运行在新生代区域。在实现上,两者共用很多代码。在不同运行环境下,根据CPU核数,开启不同的线程数,从而达到最优的垃圾回收效果。
ParNew和Serial Old示意图
4、Parallel Scavenge(并行)
Parallel Scavenge回收器也是运行在新生代区域,属于多线程的回收器,采用复制算法。与ParNew不同的是,ParNew回收器是通过控制垃圾回收的线程数来进行参数调整,而Parallel Scavenge回收器更关心的是程序运行的吞吐量。即一段时间内用户代码运行时间占总运行时间的百分比。
5、Parallel Old(并行)
Parallel Old回收器是Parallel Scavenge回收器的老生代版本,属于多线程回收器,采用标记-整理算法。Parallel Old回收器和Parallel Scavenge回收器同样考虑了吞吐量优先这一指标,非常适合那些注重吞吐量和CPU资源敏感的场合。
Parallel Scavenge和Parallel Old示意图
6、CMS(多线程并发收集)
CMS回收器是在最短回收停顿时间为前提的回收器,属于多线程回收器,采用标记-清除算法。(注意:初始标记很快,它只把GCRoot的第一级标记出来)
CMS的两个最主要缺点:
a. 无法处理浮动垃圾,可能会出现(Concurrent Mode Failure)失败而导致的另一次Full GC产生:由于CMS在并发清理阶段用户的线程仍在运行。伴随着程序的运行指定会产生新的垃圾,这种垃圾出现在标记过程之后,CMS无法在当此处理中处理掉他们,这些就是浮动垃圾。同样因为,在清理过程中用户线程也得跑,就需要预留有足够的内存空间给用户使用。如果运行的过程中的预留的空间不够使用,那么就会发生(Concurrent Mode Failure),触发一次Full GC,临时启用 Serial Old收集器重新对老年代进行收集。这样的停顿时间过长。解决方案-配合Serial Old一起使用
b. 会产生大量的内存碎片。
由于该收集器使用的标记-清除收集算法,就会不可避免地产生大量的内存碎片。给较大的对象分配带来了很大的麻烦。解决方案-提供配置参数,设置多少次FullGC后,进行一次压缩。
cms示意图
7、G1(多线程并发收集)
G1是 JDK 1.7中正式投入使用的用于取代CMS的压缩回收器。它虽然没有在物理上隔断新生代与老生代,但是仍然属于分代垃圾回收器。G1仍然会区分年轻代与老年代,年轻代依然分有Eden区与Survivor区。
G1示意图
声明:本站部分文章内容及图片转载于互联 、内容不代表本站观点,如有内容涉及侵权,请您立即联系本站处理,非常感谢!