JVM的垃圾收集器

来源:互联网 发布:如何分析问卷调查数据 编辑:程序博客网 时间:2024/05/16 23:48

    JVM中有不同的垃圾收集算法来进行垃圾回收,垃圾回收只靠算法是不行的,还需要相应的实现,垃圾收集器就是垃圾回收算法的实现。不同的虚拟机中,对垃圾回收算法的实现各不相同,以Hotspot虚拟机为例,提供了如下的几种垃圾收集器。


                                                         


Serial收集器


        Serial收集器是最基本、历史最悠久的收集器,它是一个单线程收集器。它是使用一个CPU或者一个线程去完成垃圾回收工作,而且在进行垃圾回收时,必须暂停其他所有工作的线程,直到垃圾回收完成,这个现象称为“Stop The World”。例如,使用Eclipse,有时候会遇见Eclipse完全不响应,过一会儿就没问题了,可能就是Eclipse在进行垃圾回收。


        Serial收集器依然是虚拟机Client模式下默认的新生代收集器,它虽然是单线程垃圾回收,但是相对于其他收集器的单线程要简单而高效,而且是在单个CPU环境下专心做垃圾回收,不与其他线程交互。它的工作过程如下图所示:




ParNew收集器


        ParNew收集器其实就是Serial收集器的多线程版本,除了使用多线程收集,其余的例如Serial收集器可用的所有控制参数、收集算法、Stop The World、对象分配规则、回收策略等都与Serial收集器完全一样。


        ParNew收集器属于并发和并行的垃圾收集器,那么什么是并发和并行呢?所谓并行,是指多条垃圾收集线程同时执行,但用户线程仍处于等待状态;所谓并发,是指用户线程和垃圾收集线程同时执行(但不一定是并行的,可能是交替执行),用户线程继续执行,而垃圾收集程序运行在另一个CPU上。ParNew收集器的工作过程如下图所示:




Parallel Scavenge收集器


        Parallel Scavenge收集器和ParNew收集器很类似,同样是一个新生代收集器,也是使用复制算法的收集器,而且是并行的多线程收集器,但是它和ParNew收集器的关注点不同。ParNew收集器关注点在尽可能缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge收集器关注的是吞吐量。所谓的吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)。


        停顿时间短的收集器适合需要与用户交互的程序,可以提高用户体验度;高吞吐量的收集器可以提高利用CPU的时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。Parallel Scavenge收集器有相应的参数,来设置保证高吞吐量,分别是控制最大垃圾收集停顿时间的-XX:MaxGCPauseMillis和直接设置吞吐量大小的-XX:GCTimeRatio。


Serial Old收集器


        Serial Old收集器是Serial收集器的老年代版本,它同样是一个单线程收集器,使用“标记-整理”算法。这个收集器的主要意义在于给Client模式下的虚拟机使用。它的工作过程如下图所示:




Parallel Old收集器


        Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。它的工作过程如下图所示:




CMS收集器


        CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器,CMS收集器是基于“标记-清除”算法实现的,它的运作过程相对于前面几种收集器来说更复杂一些,整个过程分为4个步骤,包括初始标记、并发标记、重新标记、并发清除,其中,初始标记、重新标记这两个步骤仍然需要“Stop The World”。初始标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快;并发标记阶段就是进行GC Roots Tracing的过程;重新标记阶段则是为了修正并发标记期间因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录。


        CMS是一款优秀的收集器,它主要的优点就是并发收集和低停顿,它也有三个明显的缺点:对CPU资源非常敏感、无法处理浮动垃圾、收集结束后会有大量碎片空间存在。它的工作过程如下图所示:




G1收集器


        G1收集器是在JDK1.7之后才有的收集器,它具备以下特点:并行与并发、分代收集、空间整合、可预测的停顿。G1收集器的工作过程有下面几个步骤:初始标记、并发标记、最终标记和筛选回收。初始标记阶段只是标记一下GC Roots能直接关联到的对象,并且修改TAMS的值;并发标记阶段是从GC Root开始对堆中的对象进行可达性分析,找出存活对象;最终标记阶段则是为了修正在并发标记期间因用户程序继续运作而导致标记产生变动的那一部分标记记录;筛选回收则是回收垃圾对象。它的工作过程如下所示:




总结


        不同的收集器对应不同垃圾收集算法,新生代和老年代适用的收集器也不同,应该针对不同的需求,选择合适的收集器,才能更好地达到目的。

原创粉丝点击