垃圾收集器的种类及原理

来源:互联网 发布:电棍在淘宝上叫什么 编辑:程序博客网 时间:2024/04/29 14:02

1、Serial收集器:古老的单线程收集器,作用于新生代。单线程的意义并非仅仅是只使用一条线程进行垃圾回收,更重要的是,在进行垃圾回收的时候,必须暂停其他所有的工作线程,因此,用户体验很不好。单实际上,Serial并不是一个一无是处的垃圾收集器,当虚拟机运行在Client模式下,Serial仍然是Client模式下的默认垃圾收集器。它有着优于其他收集器的地方:简单而高效。对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的,单线程收集效率,收集几十M甚至一两百M的垃圾(仅仅是新生代使用的内存,桌面应用不会再大了),停顿时间可以控制在几十毫秒最多一百毫秒,因此是一个很好的选择。


2、ParNew收集器:其实就是Serial收集器的多线程版本,但是同样需要stop the world。ParNew收集器是工作在Server模式下的虚拟机中首选的新生代收集器。除了性能以外,更重要的原因是ParNew是目前唯一能与CMS收集器配合工作的收集器。ParNew收集器与Serial收集器在可用的所有控制参数、收集算法、Stop the world、对象分配规则、回收策略等都与Serial收集器完全一样,也公用了相当多的代码。ParNew收集器在单cpu的环境中绝对不会有比Serial收集器更好的效果,它默认开启的收集线程数与cpu的数量相同,在cpu非常多的环境中,可以使用-XX:ParallelGCThreads来限制垃圾收集器的线程数


3、CMS收集器:一款老年代收集器。这是第一款真正意义上的并发收集器,这款收集器在强交互的应用中几乎具有划时代的意义,它第一次实现了让垃圾收集线程与用户工作线程同时工作,简单的说,就是你妈妈在打扫房间的时候,你可以往地上扔纸了。不幸的是,作为老年代收集器,确无法与jdk1.4.0中的已经存在的新生代收集器:Parallel Scavenge配合工作。所以在jdk1.5中,CMS收集器只能与Serial或者ParNew收集器联合工作。


4、Parallel Scavenge收集器:也是一个新生代收集器,它也是使用复制算法的,并行的多线程的收集器,看上去和ParNew一样,它的特别之处在于,使用Parallel Scavenge收集器的目的在于达到一个可控制的吞吐量。吞吐量是指CPU用于执行用户线程的时间与CPU的总运行时间的比值,虚拟机运行了100分钟,垃圾回收用了1分钟,则吞吐量就是99%。停顿时间越短就越适合与用户交互的程序,良好的响应速度能提高用户的体验。而高吞吐量可以高效率的利用cpu时间,尽快完成程序的运算任务。主要适合在后台进行计算而不需要太多交互的任务。

Parallel Scavenge收集器提供了两个参数用于精确的控制吞吐量:

-XX:MaxGCPauseMillis:最大垃圾收集停顿时间

-XX:GCTimeRatio:直接控制吞吐量

但是GC停顿时间的缩短,是用牺牲吞吐量和新生代空间来换取的。

除了上述两个参数外,Parallel Scavege收集器还提供了一个参数:

-XX:UseAdaptiveSizePolicy:这是一个开关参数,当这个参数打开之后,就不需要手工指定新生代的大小,(-Xmn)、Eden与Survivor区的比列

(-XX:SurvivorRatio)、晋升老年代对象的年龄(-XX:PretenureSizeThreshold)等细节参数了,虚拟机会根据监测结果自动分配,这种方式称之为GC自适应调节策略。


5、Serial Old优化器:是Serial的老年代版本,也是一个单线程收集器,使用标记整理算法。这个收集器的主要作用也是用于在Client模式下使用,如果是Server模式下,它主要还有两大用途,一是可以与Parallel Scavege收集器搭配使用,而是作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用,这两点将在后面的章节中详细讲解。


6、Parallel Old收集器是Parallel Scavenge收集器的老年代版本,使用多线程和标记整理算法。这个收集器是JDK1.6版本以后才开始提供的,在此之前,新生代的收集器Parallel Scavenge一直处于一个比较尴尬的境地。原因是,新生代选择了Parallel Scavenge收集器,老年代除了Serial Old收集器外别无选择(Parallel Scavenge收集器无法与CMD收集器配合使用)。由于老年代Serial Old收集器在服务端上性能的拖累,使用了Parallel Scavenge未必能获得整体效果上的吞吐量最大化。


7、CMS(Concorrect mask sweep)收集器:一种以获取最短停顿时间为目标的收集器。从名字上可以看出,这种收集器是基于标记清扫算法实现的,它的运作过程相当于前面几种收集器更复杂一点,整个过程分为四个步骤:

初始标记

并发标记

重新标记

并发清除

其中,初始标记,并发标记这两个过程仍然需要stop the world,初始标记仅仅只是标记一下GC ROOT 能直接关联到的对象,速度很快,并发标记就是进行GC Roots Tracing的过程,而重新标记阶段则是为了修改并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记时间稍微长一点,单远比并发标记的时间短。

由于整个过程中耗时最长的并发标记和并发清楚过程,收集器线程都可以与用户线程一起工作,所以,从总体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。









0 0
原创粉丝点击