1.Serial垃圾回收器
从这个垃圾回收器的名字中就可以看出来这个垃圾回收器是仅仅只有一个线程进行垃圾回收的垃圾回收器,这个垃圾回收器应用于新生代。采用的是复制算法进行垃圾回收,可以这样理解,因为是仅仅是单一线程,因此这个垃圾回收器是在client端的默认垃圾回收器。
2.Serial Old垃圾回收器
从这个垃圾回收器的名字中可以看出,这个垃圾回收器是用于老年代的一个串型垃圾回收器。这个垃圾回收器采用的是标记压缩/整理算法完成。主要原因是在老年代空间比较宝贵,不希望出现空间碎片的现象。
小结
这两个垃圾回收器通常是在client模式下配合使用的,在单一线程的模式下,这样单线程的垃圾回收实现简单,且没有线程切换带来的开销。
3.ParallelNew回收器
在这个垃圾回收器的名字可以看出,这个垃圾回收器是多线程并行在新生代收集垃圾对象,相当于是Serial垃圾回收器的多线程版本。这个垃圾回收器是和Serial Old垃圾回收器进行配合使用的。(其实是不太合适的,后面的jdk版本中逐渐淘汰了这种组合)有的时候,ParallelNew回收器也和CMS回收器进行配合处理。这个回收器是Server模式下新生代的默认垃圾回收器。
4.Parallel Scavenge垃圾回收器
这个垃圾回收器和ParallelNew回收器的区别是,当下的这个回收器更注重吞吐量,是一种吞吐量优先的垃圾回收器,因此相对于ParallelNew回收器,当下的回收器在老年代搭配的回收器是Parallel Old垃圾回收器
5.Parallel Old回收器
这个垃圾回收器是在老年代中进行并行回收的垃圾收集器。这个垃圾回收器通Parallel scavenge垃圾回收器配合使用。
6.CMS(currentMarkSweep,并发,标记,清除)垃圾回收器
在这个垃圾回收器的名字就可以看出来,这个垃圾回收器是一个并发执行(通过和工作线程一起工作完成垃圾回收)的垃圾回收器,同时采用的是标记清除算法,而不是前面所说的老年代中一般采用标记整理算法进行垃圾回收。 CMS进行垃圾回收的4个阶段
- 初始标记,在这个标记阶段主要是垃圾回收线程单独进行工作,出现STW。这个阶段主要是完成相当于于老年代的GCRoot的标记。
- 并发标记,在这个阶段主要是根据GCRoot引用链完成遍历。
- 重新标记,这个阶段主要是完成并发标记阶段的错误纠正,因为并发标记的时候,工作线程也在执行。
- 并发清除,在这个阶段,垃圾回收线程和工作线程一起工作,垃圾回收线程完成垃圾的清除任务。
这个垃圾回收线程是和工作线程并发地进行的,因此不能像前面说的几种垃圾回收器一样,等到垃圾几乎占据了整个老年代才进行垃圾回收。一定要等到堆内存的利用率达到一定的程度的时候就提前开始进行垃圾回收。如果生产垃圾的速度大于回收垃圾的速度的话,就会出现concurrent mode failure错误,这样的话。JVM就会采用serial Old进行垃圾回收了。
CMS垃圾回收器的缺点
- 降低总体的吞吐量,原因是长时间占用一个工作线程作为垃圾回收线程。这在CPU资源紧张的时候是很消耗性能的。
- 会产生内存碎片,因为CMS是采用标记清除这个手段来完成垃圾回收的,会产生内存碎片的问题。同时还要额外维护一张空闲列表
- 无法处理浮动垃圾,因为在CMS的并发清除阶段也会产生一些额外的垃圾,这些垃圾没有办法在本次回收期间完成垃圾的回收。只能等待下一次垃圾回收的时候完成回收。并且这个浮动垃圾其实是比较严重的,这个垃圾不断积累的话会产生concurrent mode failure,最终导致启用serial old垃圾回收器完成垃圾的回收。