JVM垃圾收集器介绍

  垃圾回收算法是GC的方法论,垃圾收集器就是内存回收的具体实现。

  一、Serial 收集器

    单线程收集器,在进行GC时,必须暂停所有的工作线程(Stop The World),直到GC收集结束。

    缺点:“Stop The World”给用户带来了不好的体验

    优点:简单而高效,Serial没有其他线程交互的开销,专心做GC可以获得最高的单线程收集效率。

    适用于Client模式下的虚拟机是个很好的选择。

  二、ParNew 收集器

     ParNew收集器就是Serial收集器的多线程版本,适用于Service模式下的新生代收集器。

     ParNew在单核CPU环境中绝对不会有比Serial收集器更好的效果。但是多核CPU,GC效果还是不错的。  

  三、Parallel Scavenge 收集器

    Parallel Scavenge 收集器也是一个新生代收集器,使用复制算法,同时也是一个并行的多线程收集器。

    Parallel Scavenge 收集器的目标则是达到一个可控制的吞吐量。

    注:吞吐量 =用户运行代码时间 / (运行代码时间 + 垃圾收集时间)

    吞吐量高则可以最高效率的利用CPU时间,尽快的完成程序的运算任务,主要适用于后台运算二不需要太多的交互任务。

  四、Serial Old 收集器

    Serial Old 收集器是Serial收集器的老年代版本,单线程收集器,使用“标记-整理”算法。

  五、Parallel Old 收集器

    Parallel Old 收集器是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。

  六、CMS 收集器

    CMS(Concurrent Mark Sweep)收集器是一种以获取最短停顿时间为目标的收集器。目前很大一部分Java应用程序都集中是在互联网或B/S系统的服务器上,这类应用尤其重视服务器的响应速度,希望系统停顿时间最短,给用户最好的体验。整个过程分为四步:

  • 初始标记(CMS initial mark):标记一下GC Root能直接关联到的对象,速度很快;
  • 并发标记(CMS concurrent mark):进行GC Root Tracing的过程
  • 重新标记(CMS remark):修正并发标记期间,因用户程序继续运行导致标记产生变动的那一部分对象的标记记录;
  • 并发清除(CMS concurrent sweep)  

  其中初始标记、重新标记还是需要“Stop The World”.CMS收集器的内存回收过程与用户线程并发执行。

  优点是并发收集、低停顿

  缺点:1)CMS收集器对CPU资源非常敏感;在并发阶段虽然不会导致用户线程停顿,但是会因为占用了一份线程而导致应用程序变慢,总吞吐量降低。

     2)CMS并发清除阶段用户线程还在运行,伴随线程运行产生的新的垃圾出现在标记过程以后,CMS无法在本次收集中处理掉它们,只能留到下次GC。这一部分垃圾就是“浮动垃圾”。

     3)CMS是一款“标记-清除”算法实现的收集器,收集过程会产生大量的空间碎片。空间碎片过多,将会给较大对象无法分配内存,从而触发一次 Full GC.

  七、G1 收集器

    G1(Garbage First)收集器相比于CMS改进有:

    (1)G1基于“标记-整理”算法实现收集器,即它不会产生大量的空间碎片,这对于长时间的应用系统非常重要。

    (2)可以非常准确的控制停顿,既能让使用者明确指定一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不超过N毫秒。G1将Java堆(包括新生代、老年代)划分为多个大小固定独立区域,并且跟踪这些区域里面的垃圾堆积程度,在后台维护一个优先列表,每次根据允许的收集时间,优先回收垃圾最多的区域。

原文地址:https://www.cnblogs.com/parryyang/p/5748793.html