JVM之垃圾收集器(3)

JDK1.7 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)

JDK1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)

JDK1.9 默认垃圾收集器G1

垃圾搜集器:

 串行搜集器(serial collector):Serial、Serial Old

 并行搜集器(parallel collector): ParNew、Parallel Old、Parallel Scavenge

 并发搜集器(concurrent collector):Concurrent Mark Sweep[CMS]

JVM之垃圾收集器(3)

新生代收集器: Serial、ParNew、Parallel Scavenge;

老年代收集器: Serial Old、Parallel Old、CMS;

G1 收集器

Serial收集器

串行收集器是最古老,最稳定以及效率高的收集器,可能会产生较长的停顿,只使用一个线程去回收。新生代、老年代使用串行回收;新生代复制算法老年代标记-压缩;垃圾收集的过程中会Stop The World(服务暂停)

参数控制:-XX:+UseSerialGC  串行收集器

ParNew收集器

ParNew收集器其实就是Serial收集器的多线程版本。新生代并行,老年代串行;新生代复制算法、老年代标记-压缩

参数控制:-XX:+UseParNewGC  ParNew收集器

-XX:ParallelGCThreads 限制线程数量

Parallel Scavenge收集器

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

该收集器的目标是达到一个可控制的吞吐量(Throughput)。所谓吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即 吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)

参数控制:-XX:+UseParallelGC  使用Parallel收集器

                  -XX:MaxGCPauseMillis  控制最大垃圾收起停顿时间

                  -XX:GCTimeRatio     设置吞吐量大小的参数

                  -XX:+UseAdaptiveSizePolicy。这是一个开关参数,当这个参数打开后,就不需要手工指定新生代的大小(-Xmn)、Eden与Survivor区的比例(-XX:SurvivorRatio)、晋升老年代对象年龄(-XX:PretenureSizeThreshold)等细节参数,只需要把基本的内存数据设置好(如-Xmx设置最大堆)

Parallel Old 收集器

Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。这个收集器是在JDK 1.6中才开始提供

参数控制: -XX:+UseParallelOldGC 使用Parallel收集器+ 老年代并行

CMS收集器

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的Java应用都集中在B/S系统的服务端上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。从名字(包含“Mark Sweep”)上就可以看出CMS收集器是基于“标记-清除”算法实现的。

优点:并发收集低停顿 

缺点:产生大量空间碎片并发阶段会降低吞吐量

参数控制:-XX:+UseConcMarkSweepGC  使用CMS收集器

             -XX:+ UseCMSCompactAtFullCollection Full GC后,进行一次碎片整理;整理过程是独占的,会引起停顿时间变长

            -XX:+CMSFullGCsBeforeCompaction  设置进行几次Full GC后,进行一次碎片整理

            -XX:ParallelCMSThreads  设定CMS的线程数量(一般情况约等于可用CPU数量)