HotSpot的7种垃圾收集器组合

HotSpot共有7种垃圾收集器,3个新生代垃圾收集器,3个老年代垃圾收集器,以及G1,一共构成7种可供选择的垃圾收集器组合。html

新生代与老年代垃圾收集器之间造成6种组合,每一个新生代垃圾收集器都对应2种组合。java

Serial Old(MSC)能够与全部新生代收集器进行组合,共3种组合

JVM仅指定新生代垃圾收集器的状况下,默认老年代采用Serial Old垃圾收集器(带压缩)web

-XX:+UseSerialGC

Serial (DefNew) + Serial Old(Serial Mark Sweep Compact)算法

-XX:+UseParNewGC

Parallel (ParNew) + Serial Old(Serial Mark Sweep Compact)架构

-XX:+UseParallelGC

Parallel Scavenge (PSYoungGen) + Serial Old(Serial Mark Sweep Compact (PSOldGen))并发

注:在Parallel Scavenge收集器架构中自己有PS MarkSweep收集器来进行老年代收集,但因为PS MarkSweep与Serial Old实现很是接近,所以官方的许多资料都直接以Serial Old代替PS MarkSweep进行讲解。oracle

Parallel Old(带压缩)只能与Parallel Scavenge进行组合

-XX:+UseParallelOldGC

Parallel Scavenge (PSYoungGen) + Parallel Mark Sweep Compact (ParOldGen)jvm

CMS(不带压缩)能够与Serial和ParNew进行组合,共2种组合

-XX:-UseParNewGC -XX:+UseConcMarkSweepGC

Serial (DefNew) + CMS(Concurrent Mark Sweep)ide

-XX:+UseParNewGC -XX:+UseConcMarkSweepGC

Parallel (ParNew) + CMS(Concurrent Mark Sweep) + Serial Old(Serial Mark Sweep Compact)性能

G1(Garbage First),不须要搭配其余垃圾收集器

-XX:+UseG1GC

6种垃圾收集组合关系图

blogs.oracle.com/jonthecolle…

www.oracle.com/technetwork…

新生代垃圾收集器

全部新生代垃圾收集器,都使用复制算法,都会发生stop-the-world。因为绝大多数对象的生命周期一般比较短,在新生代被回收的可能性很大,新生代的垃圾回收一般能够回收大部分对象,所以采用复制算法效率更高。

Serial

采用复制算法,GC时发生stop-the-world,使用单个GC线程

"Serial" is a stop-the-world, copying collector which uses a single GC thread.

ParNew

采用复制算法,GC时发生stop-the-world,使用多个GC线程

ParNew 与 Parallel Scavenge的一个主要区别是,ParNew能够与CMS进行搭配使用。

"ParNew" is a stop-the-world, copying collector which uses multiple GC threads. It differs from "Parallel Scavenge" in that it has enhancements that make it usable with CMS. For example, "ParNew" does the synchronization needed so that it can run during the concurrent phases of CMS.

Parallel Scavenge

采用复制算法,GC时发生stop-the-world,使用多个GC线程吞吐量优先收集器,可控制最大垃圾收集停顿时间(-XX:MaxGCPauseMillis)与吞吐量大小(-XX:GCTimeRatio),支持GC自适应的调节策略(GC Ergonomics,对应参数-XX:+UseAdaptiveSizePolicy)。

"Parallel Scavenge" is a stop-the-world, copying collector which uses multiple GC threads.

老年代垃圾收集器

除了CMS,其余的老年代垃圾收集器GC时都是stop-the-world,都会在清理垃圾以后进行压缩整理

Serial Old

采用标记整理算法,GC时发生stop-the-world,使用单个GC线程

"Serial Old" is a stop-the-world, mark-sweep-compact collector that uses a single GC thread.

CMS

CMS采用标记清理算法,是一个以低暂停时间为目标的垃圾收集器。GC时大部分时间并发执行,其中初始化标记和从新标记两个阶段仍然会发生stop-the-world,其他阶段都是并发执行

"CMS" is a mostly concurrent, low-pause collector.

Java之CMS GC的7个阶段:mp.weixin.qq.com/s/vmnBlrM7p…

Parallel Old

采用标记整理算法,GC时发生stop-the-world,使用多个GC线程

"Parallel Old" is a compacting collector that uses multiple GC threads.

G1

G1将整个堆划分为多个大小相等的独立区域(Region),保留新生代和老年代的分代概念(但二者再也不是物理隔离的)。

从总体来看是基于标记整理算法,从局部(两个Region之间)来看是基于复制算法。所以,能够避免产生内存空间碎片,防止发生并发模式失败。

使用多个GC线程,每次优先回收价值最大的Region

支持可预测的停顿时间模型,从而提升收集效率,下降stop-the-world的时间

The Garbage First or G1 garbage collector is available in Java 7 and is designed to be the long term replacement for the CMS collector. The G1 collector is a parallel, concurrent, and incrementally compacting low-pause garbage collector that has quite a different layout from the other garbage collectors described previously.

推荐使用的2种GC组合

1.基于低停顿时间的垃圾收集器

-XX:+UseConcMarkSweepGC(该参数隐式启用-XX:+UseParNewGC)

2.基于吞吐量优先的垃圾收集器

-XX:+UseParallelOldGC(该参数隐式启用-XX:+UseParallelGC)

www.oracle.com/technetwork…


参考

blogs.oracle.com/jonthecolle…

www.oracle.com/technetwork…

blog.ragozin.info/2016/10/hot…

docs.oracle.com/javase/8/do…

www.oracle.com/webfolder/t…

plumbr.io/handbook/ga…

《深刻理解Java虚拟机 JVM高级特性与最佳实践》周志明

《Java性能权威指南》

Java之CMS GC的7个阶段:mp.weixin.qq.com/s/vmnBlrM7p…

我的公众号

更多文章,请关注公众号:二进制之路

二进制之路
相关文章
相关标签/搜索