HotSpot的7种垃圾收集器组合

3,590 阅读4分钟

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

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

Serial Old(MSC)可以与所有新生代收集器进行组合,共3种组合

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

-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进行讲解。

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

-XX:+UseParallelOldGC

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

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

-XX:-UseParNewGC -XX:+UseConcMarkSweepGC

Serial (DefNew) + CMS(Concurrent Mark Sweep)

-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…

个人公众号

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

二进制之路