JVM GC收集器-Serial,Parallel,CMS,G1

1.Serial(串行收集器)

     Serial收集器是一个单线程的收集器,但它的“单线程”的意义并不仅仅是说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程(stop the world),直到它收集结束。CPU利用率最高,停顿时间即用户等待时间比较长。

使用用法:设置JVM参数-XX:+UseSerialGC

2.Parallel( 并行/吞吐优先收集器)

    并行收集器可以理解是多线程串行收集,在串行收集基础上采用多线程方式进行GC,很好的弥补了串行收集器的不足,可以大幅缩短停顿时间,因此对于空间不大的区域(如young generation),采用并行收集器停顿时间很短,回收效率高,适合高频率执行。

使用方法:设置JVM参数-XX:+UseParallelGC

3.CMS 收集器

    CMS(Concurrent Mark Sweep)收集器是基于“标记-清除”算法实现的,它使用多线程的算法去扫描堆(标记)并对发现的未使用的对象进行回收(清除)。整个过程分为6个步骤,包括: 
① 初始标记(CMS initial mark) 
② 并发标记(CMS concurrent mark) 
③ 并发预清理(CMS-concurrent-preclean) 
④ 重新标记(CMS remark) 
⑤ 并发清除(CMS concurrent sweep) 
⑥ 并发重置(CMS-concurrent-reset)

CMS是Concurrent-Mark-Sweep的缩写,并发的标记与清除。这个算法使用多个线程并发地(concurrent)扫描堆,标记不使用的对象,然后清除它们回收内存。在两种情况下会使应用暂停(Stop the World, 简称STW):

① 当初次开始标记根对象时initial mark;

② 当在并行收集时应用又改变了堆的状态时,需要它从头再确认一次标记了正确的对象final remark。

这个收集器最大的问题是在年轻代与老年代收集时会出现的一种竞争情况(race condition),称为提升失败(promotion failure)。对象从年轻代复制到老年代称为提升(promotion),但有时侯老年代需要清理出足够空间来放这些对象,这需要一定的时间,它收集的速度可能赶不上不断产生的要提升的年轻代对象的速度,这时就需要做STW的收集。STW正是CMS想避免的问题。为了避免这个问题,需要增加老年代的空间大小或者增加更多的线程来做老年代的收集以赶上从年轻代复制对象的速度。
再者,CMS最大的问题就是内存空间碎片化的问题。CMS只有在触发FullGC的情况下才会对堆空间进行压缩(compact)。如果线上应用长时间运行,碎片化会非常严重,会很容易造成promotion failed。为了解决这个问题线上很多应用通过定期重启或者手工触发FullGC来触发碎片整理。

使用方法:设置JVM参数 -XX:+UseConcMarkSweepGC

4.G1(Garbage First)收集器

     首先将Java堆空间划分为一些大小相等的区域(region),每个区域都是虚拟机中的一段连续内存空间。G1通过执行并发的全局标记来确定整个Java堆空间中存活的对象。标记阶段完成后,G1就知道哪些区域基本上是空闲的。在回收内存时优先回收这些区域,这样通常都会回收相当数量的内存。这就是为什么它叫做Garbage-First的原因。顾名思义G1关注某些区域的回收和整理,这些区域中的对象很有可能被完全回收。而且G1使用了一个暂停时间预测模型使得暂停时间控制在用户指定的暂停时间内,并根据用户指定的暂停时间来选择合适的区域回收内存。
     G1与CMS收集器相比有两个显著的改进:① G1收集器是基于“标记-整理”算法实现的收集器,也就是说它不会产生空间碎片,这对于长时间运行的应用系统来说非常重要。② 它可以非常精确地控制停顿,即能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒;
使用方法:设置JVM参数 –XX:+UseG1GC

发布了215 篇原创文章 · 获赞 375 · 访问量 97万+

猜你喜欢

转载自blog.csdn.net/zhangxing52077/article/details/88312453
今日推荐