Java虚拟机-垃圾回收器
新生代垃圾收集器:Serial、ParNew、Parallel Scavenge
老年代收集器:CMS、Serial Old、Parallel Old
新生代和老年代都能回收的收集器:G1

Serial收集器
Serial收集器是一个单线程工作的收集器,在它进行垃圾回收工作时,必须暂停其他所有工作线程(Stop The World),直到收集结束。
对于内存资源受限的环境,Serial是所有收集器中消耗额外内存最小的。
在单核处理器或者处理器核心较少的环境,Serial由于没有线程交互的开销,可以获得最高的单线程收集效率。
ParNew收集器
ParNew收集器实质上是Serial收集器的多线程版本,ParNew的多线程指的是垃圾回收时进行多线程的回收,并不能和用户线程一起工作,依然需要Stop The World。
Parallel Scavenge收集器
Parallel Scavenge是基于“标记-整理算法”实现的垃圾收集器,也能够进行并行收集的多线程收集器。
Parallel Scavenge收集器关注的是达到一个可以控制的吞吐量。
吞吐量=运行用户代码时间 /(运行用户代码时间+运行垃圾收集的时间)
Serial Old收集器
Serial Old收集器是Serial的老年代版本,它同样是一个单线程收集器,使用“标记-整理算法”。
在服务端模式下,他的两个用途:
在Jdk5版本之前中Serial Old和Parallel Scavenge配合使用。
在CMS收集器发生失败后(并发收集出现Concurrent Mode Failure时)使用。
Parallel Old收集器
Parallel Old收集器时Parallel Scavenge的老年代版本,支持多线程并发收集,基于“标记-整理算法”实现。
CMS(Concurrent Mark Sweep)收集器
CMS收集器以获取最短停顿时间为目标,是基于“标记-清除”算法实现的。收集过程分为四个步骤:
初始标记:需要暂停用户进程,工作是标记GC Roots能直接关联的对象。
并发标记:从GC Roots直接关联的对象开始遍历对象图。(与用户进程并发运行)
重新标记:需要暂停用户进程,为了修正并发标记期间,用户程序运行导致标记产生变动的对象的标记记录。
并发清除:清理掉被标记阶段判断已经“死亡”的对象。(与用户进程并发运行)
CMS收集器的缺点:
面向并发设计的程序都对处理器资源比较敏感。在并发阶段CMS虽然不会导致用户进程停顿,但是会消耗一部分线程资源,导致应用程序变慢,吞吐量降低。
CMS收集器无法处理“浮动垃圾”,有可能会出现“Concurrent Mode Failure”而导致“Full GC”的发生。
CMS是一款基于“标记-清除算法”的收集器,收集结束会产生大量的空间碎片。在空间碎片过多时,会对大对象分配带来很大的麻烦,无法分配足够大的连续空间时,不得不提前触发“Full GC”
浮动垃圾是指CMS收集器在并发标记和清除阶段,用户程序产生的垃圾,CMS收集器无法在当次垃圾收集中处理掉它们。
G1(Garbage First)收集器
G1收集器开创了收集器面向局部收集的思路和基于Region的内存布局。
Region中还有一类特殊的Humongous区域,专门用来存放大对象(大小超过Region的一半)。
G1仍然保留了新生代和老年代的概念,但是新生代和老年代不是固定的,它们都是一系列区域的动态集合。
G1可以面对堆内存中的任何部分进行回收,衡量保准不是内存属于哪一个分代,而是哪块内存中存放的垃圾最多,回收收益最大,这就是G1的Mixed GC模式。
G1收集器的运作过程:
初始标记:标记GC Roots能直接关联到的对象,并修改TAMS指针的值,让下一阶段用户进程并发运行时能在可用的Region中分配对象。
并发标记:从GC Roots直接关联的对象开始,对堆中对象进行可达性分析,找出要回收的对象。
最终标记:暂停用户线程,处理并发阶段结束后仍然遗留下来的最后少量的SATB记录。
筛选回收:负责更新Region的统计数据,对Region的回收价值和成本进行排序,根据用户期望停顿时间来制定回收计划,把存活的对象复制到空Region中,然后清空这个旧Region。
与CMS比较:
G1从整体角度上看是使用的“标记-整理算法”,从Region的角度看使用的是“标记-复制算法”。不会产生空间碎片。
G1为了垃圾收集产生的垃圾占用和程序运行时的额外负载都比CMS高。