Java之垃圾收集器比较

Serial收集器

  • 此收集器是单线程的,但它的”单线程“的意义并不仅仅说明它是一个CPU或一条收集线程去完成垃圾收集工作,更重要的是在进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束(会发生STW)。
  • 简单高效(与其他收集器的单线程比)没有线程交互的开销,专心做垃圾收集。
  • 新生代收集器、使用复制算法。
  • 大多运行在Client模式下的默认新生代收集器。

ParNew收集器

  • Serial收集器的多线程版本,添加了可用的所有控制参数(例如:-xx:SurvivorRatio、-XX:PretenureSizeThreshold、-XX:HandlePromotionFailure等)、收集算法、Stop the World、对象分配规则,回收策略等都与Serial收集器完全一样。
  • 新生代收集器,使用复制算法。
  • 大多运行在Server模式下的默认新生代收集器。
  • 目前只有它能与CMS收集器配合工作。

parallel Scavenge收集器

  • 新生代收集器,使用复制算法。
  • 可自适应调节。
  • 提供了控制参数(例如:-xx:SurvivorRatio、-XX:PretenureSizeThreshold、-XX:HandlePromotionFailure、-XX:UserAdaptiveSizePolicy),-XX:UserAdaptiveSizePolicy是个开关参数,当打开后,就不需要手动指定新生代的大小(-Xmn),Eden与Survivor区的比例(-XX:SurvivorRatio),晋升老年代对象年龄(-XX:PretenureSizeThreshold)
  • 吞吐量优先收集器

Serial Old收集器

  • 老年代收集器、单线程收集器、使用”标记-整理“算法。

Parallel Old收集器

  • 老年代收集器,使用多线程和”标记-整理“算法,JDK1.6中才开始提供。
  • 吞吐量优先收集器

CMS收集器(Concurrent Market Sweep)

  • CMS收集器是一种以获取最短回收停顿时间为目标的收集器。
  • CMS老年代收集器。
  • 并发收集器。
  • 基于”标记-清除“算法实现,整个过程分为4个步骤:

1:初始化标记(CMS initial mark)
2:并发标记(CMS concurrent mark)
3:重新标记(CMS remark )
4:并发清除(CMS concurrent Sweep)
其中,初始标记、清除标记仍然需要STW,初始标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快。
特点:并发收集、低停顿。
缺点:
1:CMS收集器无法处理浮动垃圾,可能出现Concurrent Mode Failure 失败导致另一次Full GC的发生。
2:会产生大量的空间碎片,空间碎片过多时,将会给大对象分配带来很大麻烦。

并发标记阶段是进行GC Roots Tracing的过程。
重新标记阶段则是为了修正并发标记期间用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始化标记阶段稍长一些,但远比并发标记的时间短。
由于整个过程中耗时最长的并发标记和并发清除过程收集器都可以与用户线程一起工作,所以,从总体上来说,CMS收集器的内存回收过程是用户线程一起并发执行的。

G1收集器

G1是一款面向服务端应用的垃圾收集器,与CMS相比,G1具备如下特点:

1:并行与并发
2:分代收集
3:空间整合,与CMS的“标记-清理”算法不同,G1从整体来看是基于“标记-整理”算法实现的收集器
4:可预测的停顿

G1收集器的运作大致可划分为几个步骤

1:初始化标记(initial marking)
2:并发标记(concurrent marking)
3:最终标记(Final Marking)
4:筛选回收(Live Data Counting Evacuation)

你可能感兴趣的:(Java之垃圾收集器比较)