JVM学习之垃圾收集器

如果说垃圾回收算法是理论,那么垃圾收集器就是实现。今天来聊聊Hotspot几种垃圾收集器。

JVM学习之垃圾收集器_第1张图片

橙色代表新生代,绿色代表老年代,收集器直接有连线的说明可以配置使用。

1. Serial收集器

Serial收集器是最基本也是最长久的垃圾收集器。它是一个单线程收集器,它在进行垃圾对象收集时必须停掉用户线程。这样对用户体验来说就很糟糕了,所以JDK一直在努力减少因内存回收而导致停顿用户线程。到JDK1.7已经有了很大的进步,像CMS以及先进的G1先进的收集器出现,用户线程停顿时间在缩短。Serial收集器并不是老而无用的,它的特点是简单高效,单核cpu下单线程专心做垃圾收集,没有线程切换的开销,它依然是虚拟机运行在Client模式下默认新生代收集器。

2. ParNew收集器

ParNew收集器是Serial收集器的多线程版本,除了使用多条线程进行垃圾收集之外,其他参数控制、收集算法、对象分配规则、回收策略、停顿用户线程等都与Serial收集器一样。它是许多运行在server模式下的虚拟机中的首选的新生代收集器。

3. Parallel Scavenge收集器

Paraller Scavenge收集器是一个新生代收集器,同样,它也是使用复制算法,也是并行的多线程收集器。但它与其他收集器侧重点不同。例如CMS收集器尽可能减少用户线程停顿时间。而Paraller Scavenge收集器则是达到一个可控制的吞吐量,吞吐量=CPU运行用户代码的时间 / (CPU运行用户代码的时间+垃圾收集时间)。Paraller Scavenge收集器提供了两个参数用于控制吞吐量,分别是控制最大垃圾收集停顿时间的-XX:MaxGCPauseMillis参数以及直接设置吞吐量大小的-XX:GCTimesRatio参数。MaxGCPauseMillis是大于零的毫秒数,GCTimesRatio是大于0小于100的整数。但是比较尴尬的是新生代Paraller Scavenge不能于老年代CMS收集器配合使用。

4. Serial Old收集器

Serial Old收集器是作用于老年代的,看它的名字可以猜到它是Serial收集器的老年代版本,同样也是一个单线程收集器。

5. Parallel Old收集器

Parallel Old收集器是Paraller Scavenge收集器的老年代版本,是多线程和“标记--整理”算法实现的。在注重吞吐量以及CPU资源敏感的场合,可以考虑Paraller Scavenge与Parallel Old收集器。

6. CMS收集器

       CMS(Concurrent Mark Sweep) 收集器是一种以获取最短回收停顿时间为目标的收集器。CMS收集器采用“标记--清除”算法实现的。运行过程包括:1.初始标记 2. 并发标记 3. 重新标记 4. 并发清除 其中初始标记和重新标记需要“stop the world” 停止用户线程。初始标记仅仅标记一下GC Roots能关联到的对象,速度很快。并发标记阶段就是进行GC Roots Tracing的过程。重新标记阶段是因为并发标记阶段用户线程继续运作而导致对象引用产生变动对这一部分对象进行标记记录。整个过程中耗时最长的并发标记和并发清除过程收集器都是可以与用户线程一起工作的,初始标记和重新标记耗时也较短,从总体上来看,CMS收集器的内存回收过程是与用户线程一起并发执行的。

       CMS收集器是一款高效并发低停顿的收集器,但依然优缺点:1. CMS收集器对CPU资源敏感,2. CMS收集器无法处理浮动垃圾,3. CMS收集器是基于“标记--清除”算法实现的意味着收集结束后会产生大量空间碎片。

7. G1收集器

G1(Garbage-First)收集器是当今收集器技术发展比较前沿的成果,还不是最前沿的(后面会说ZGC)。G1收集器具备以下特点:

1.并行与并发,2.分代收集:G1收集器不需要其他收集器配合就可以管理整个GC堆,3.空间整合:从整体G1是基于“标记--整理”算法实现,从局部(两个Region之间)上来看是基于“复制”算法实现的,这两种算法意味着G1运作期间不会产生内存碎片,收集后可以提供规整的内存空间。这种特性有利于程序长时间运行,分配大对象时不会因为空间不足而进行full  gc  4. 可预测停顿。

 

 

你可能感兴趣的:(JVM)