美文网首页
垃圾收集器

垃圾收集器

作者: 游牧族人 | 来源:发表于2018-06-04 09:41 被阅读32次

    一、Serial收集器

    单线程垃圾收集器,运行时必须暂停所有的线程,直到收集结束。
    优:简单高效,对于限定单个CPU的环境来说,Serial收集器没有线程交互的开销,可以获得最高的单线程收集效率。
    缺:垃圾收集时必须暂停所有工作线程,用户体验不好。
    PS:虚拟机运行在客户端环境下的默认新生代收集器。

    二、ParNew收集器

    多线程垃圾收集器,是Serial收集器的多线程版本。
    优:多线程垃圾收集
    缺:单CPU情况下效率不如Serial,CPU数量越少效率越低
    PS:虚拟机运行在服务端环境下的首选新生代收集器。

    三、Parallel Scavenge收集器

    多线程垃圾收集器,新生代垃圾收集器。
    Parallel Scavenge的目标是达到可控的吞吐量【吞吐量=代码运行时间/(代码运行时间+垃圾收集时间)】,高吞吐量可以高效率的利用CPU的时间,尽快完成程序的运算任务,主要适合在后台运算而且不太需要交互的任务。
    Parallel Scavenge收集器提供了两个参数用来精确控制吞吐量:
    ①【-XX:MaxGCPauseMillis】:控制最大垃圾收集停顿时间
    参数允许的值是一个大于0的毫秒数,收集器尽可能的在指定的时间以内完成垃圾收集工作。但是GC的停顿时间减小是以牺牲吞吐量为代价的,时间越短,可收集的垃圾数就越少,垃圾收集的次数就越频繁,吞吐量就会下降。
    ②【-XX:GCTimeRatio】:设置吞吐量大小
    参数允许的值是0~100的整数,代表垃圾收集时间占总时间的比例(吞吐量的倒数)。
    【-XX:+UseAdaptiveSizePolicy】:开关参数,打开该参数后,就不需要手动指定新生代大小,Eden区和Survivor区的比例等细节参数,虚拟机会根据当前性能动态修改参数以得到最小的停顿时间或最大的吞吐量。
    优:吞吐量优先
    缺:不适合交互性强的任务使用

    四、Serial Old收集器

    Serial 收集器的老年代版本,单线程垃圾收集器,使用标记--整理算法进行垃圾收集。

    五、Parallel Old收集器

    Parallel Scavenge收集器的老年代版本,使用多线程和标记--整理算法进行垃圾收集。
    在注重吞吐量和CPU资源敏感的场合,可以优先考虑Parallel Scavenge+Parallel Old收集器。

    六、CMS(Concurrent Mark Sweep)收集器

    CMS收集器是一种以获取最短回收停顿时间为目标的收集器。
    CMS收集器是基于标记--清除算法实现的,整个过程分为四个步骤:;
    ①初始标记(需要Stop The World)
    这一阶段标记所有与GCRoot有直接关联的对象点
    ②并发标记
    这一阶段垃圾收集线程与用户线程并发执行,寻找所有与GCRoot可达的对象点
    ③重新标记(需要Stop The World)
    因为在并发标记时可能会有用户线程修改了对象之间的引用关系,重新标记阶段只是修改一下那些变动过的对象记录
    ④并发清除
    这一阶段垃圾收集线程与用户线程并发执行,清除没有被标记过的垃圾对象。
    优:低停顿并发收集器
    缺:
    ①CMS收集器对CPU资源非常敏感。
    CMS默认启动的线程数为(num(CPU)+3)/4,也就是在CPU在4个以上时,垃圾收集线程会占用不少于25%的CPU资源,并且随着CPU的数量增加而下降。但是当CPU数量不足4个时,大大降低了用户程序的执行效率,对用户程序的影响变得很大。
    ②CMS收集器无法处理浮动垃圾。
    由于CMS并发清理阶段用户线程还在执行,因此就会有新的垃圾产生,这些垃圾只能等待下一次GC才能被检测清除。
    由于CMS在垃圾清理阶段还有用户线程在执行并且产生新的垃圾对象,因此CMS收集器当老年代达到一定阈值后就必须要进行FullGC,目的是为了留出一些空间供用户线程使用,若是CMS为用户线程预留的空间无法满足用户线程分配空间的需要,则会出现一次“Concurrent Mode Failure”失败,这时虚拟机会临时启动Serial Old收集器重新对老年代进行垃圾收集。
    ③CMS收集器空间碎片化严重
    因为CMS是使用标记--清除算法工作的,所以会产生大量空间碎片。当无法为大对象提供连续的空间时,则会提前触发Full GC。
    CMS提供了两个参数解决该问题:
    【-XX:+UseCMSCompactAtFullCollection】:开关参数,默认开启
    作用是在CMS收集器空间碎片化严重时开启内存碎片合并整理过程。但是内存的整理是无法并发的,所以不得不延长停顿时间。
    【-XX:CMSFullGCsBeforeCompaction】:
    参数设置执行多少次不压缩的Full GC后,执行一次含有压缩过程的Full GC,默认是0,代表每次都执行带压缩的Full GC。

    七、G1(Garbage-First)收集器

    G1是一款面向服务端的垃圾收集器。
    G1的特点:
    ①并行与并发:G1能充分利用多核环境下的硬件优势,使用多个CPU来缩短Stop-The-World停顿时间,并且可以通过并发的方式使用户线程和垃圾收集线程同时执行。
    ②分代收集:G1不需要其他垃圾收集器的配合就能管理整个GC堆。
    ③空间整合:G1运行期间不会产生内存碎片,收集完成之后可以提供规整的可用内存。
    ④可预测的停顿
    垃圾收集过程:
    G1收集器将整个堆划分成多个相同大小的独立区域(Region),G1中的新生代和老年代都是一部分Region的集合。G1可以跟踪各个Region里面的垃圾堆积的价值大小(计算回收花费的时间和回收后获得的空间值),在后台维护一个优先列表,每次根据所允许的收集时间优先回收价值最大的Region,这保证了G1可以在有限的时间内获取最高的回收效率。
    G1的两个Region之间是通过复制算法进行垃圾回收的,但是从整体上来看,他是通过标记--整理算法实现的垃圾回收。
    其他的回收流程同CMS收集器大同小异。

    相关文章

      网友评论

          本文标题:垃圾收集器

          本文链接:https://www.haomeiwen.com/subject/tlwjsftx.html