垃圾收集器
垃圾收集器是内存回收的具体实现。Java虚拟机规范中对垃圾回收器的实现并未有任何规定,因此,不同的厂商,不同的版本的虚拟机所提供的垃圾回收器可能差异很大。下面介绍几种不同的收集器。
1.Serial收集器
Serial收集器是一个最基本,发展悠久的收集器,曾经是虚拟机新生代收集的唯一选择(JDK1.3.1之前)。它是一个单线程的收集器,它的单线程有两方面的理解:一是它只会使用一个CPU或者一条收集线程去完成垃圾收集工作;另一方面是它在进行垃圾回收时,会停止其他所有的线程工作,直到收集工作结束,通俗的将就是在进行垃圾回收时,机器其他线程被强迫停止,也就是机器暂停响应。虽然Serial收集器所采用的这样回收机制,也有他的解释,HotSpot虚拟机开发团队,一直在努力减少虚拟机所造成的停顿现象,从Serial收集器到Parallel收集器,再到Concurrent Mark Sweep等等都无法完全消除。
Serial虽然有缺点,但是它也有他的可取之处,简单,高效,没有线程之间交互的开销,从而专心的做垃圾回收工作。
2.ParNew收集器
ParNew收集器是Serial收集器的多线程版本,除了多线程进行垃圾收集之外,其余行为包括Serial收集器可用的所有控制参数,收集算法,Stop
The World,分配规则,都与Serial收集器完全一样。他们也公用了很多代码。ParNew收集器除了多线程之外,其他的与Serial并没有太多的创新之处。但它却是许多运行在Server模式下的虚拟机首选的新生代收集器,其中一个原因是。除了Serial收集器外,目前只有它能与CMS收集器配合工作。CMS作为老年代收集器,却无法与JDK1.4.0中已经存在的新生代收集器Parallel
Scavenge配合工作,所以在JDK1.5中使用CMS来收集老年代的时候,新生代只能选择ParNew或者Serial收集器中的一个。
ParNew的优点就是多线程,之所以被使用是因为所谓的兼容问题,缺点是对于单CPU环境中,绝对不会有比Serial收集器更好的效果,因为线程之间交互的开销。
3.Parallel Scavenge收集器
Parallel Scavenge收集器是一个新生代的收集器,他也使用复制算法,并行的多线程收集器,它所关注的去其他的收集器所不同,CMS等收集器的关注点是尽可能的缩短垃圾收集时用户线程的停顿,而Parallel
Scavenge收集器的目的是达到一个可控制的吞吐量。吞吐量就是CPU运行用户的代码的时间与CPU总消耗的时间的比值,也就是吞吐量=运行用户的代码的时间/(运行用户代码的时间+垃圾收集的时间),吞吐量高,处理用户的代码的时间比例高,垃圾收集的时间就短,用户体验就会得到提升。Parallel
Scavenge收集器也被称为吞吐量优先收集器。
4.Serial Old收集器
Serial收集器的老年代版本,它同样是一个单线程的收集器,使用标记-整理算法,这个收集器的主要是在于给Client模式下的虚拟机使用。
5.Parallel Old收集器
Parallel Scavenge收集器的老年代版本,使用多线程和标记-整理算法。
6.CMS收集器
是一种以获取最短回收停顿时间为目标的收集器。使用标记-清楚算法实现的,它的运作过程分为4个步骤:初始标记,并发标记,重新标记,并发清除。
初始标记和并发标记还需要停止所有其他进程,初始标记标记GC Roots能直接关联到的对象,速度很快;并发标记就是进行GC
Roots Tracing的过程,重新标记是为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录。由于整个过程消耗时间最长的并发标记和并发清除过程收集器线程可以与线程一起工作,所以CMS的收集器的内存回收过程是与用户线程一起并发的执行的。
CMS的优点:是一款优秀的收集器,主要优秀是:并发收集,低停顿,也称为并发停顿收集器,但是它还有以下3个缺点:1)CMS收集器对CPU资源非常敏感。2)CMS收集器无法处理浮动垃圾,可能出现Concurrent Mode Failure失败而导致另一次Full GC的产生。浮动垃圾:CMS并发清理阶段用户线程还在运行着,伴随程序运行自然就会有垃圾不断产生,这一部分垃圾出现在标记过程之后,CMS无法在当初收集中处理掉他们,只好等待到下一次GC时在清理掉。3)CMS是一个基于标记-清除算法实现的收集器,收集结束会出现大量空间碎片的产生。
7.G1收集器
是一款面向服务器应用的垃圾收集器。也是当今收集器发展的前沿成果之一。
它的优点
1) 并行与并发:G1能充分利用多CPU,多核环境下的硬件优势,使用多个CPU来缩短停顿的时间,G1收集器可以再收集的过程中,通过并发的方式让Java的程序继续运行。
2) 分代收集:通过在不同的年代中使用不同的收集算法。
3) 空间整合:G1从整体看,是基于标记-整理算法实现的收集器,从局部看是基于复制的算法实现的。无论如何,这两种算法都意味着G1在运作期间不会产生内存空间碎片。
4) 可预测的停顿:建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段内。
本章节简单的介绍了各个虚拟机的内容以及优缺点,内容来源《深入理解Java虚拟机》