HotSpot共有7种垃圾收集器,3个新生代垃圾收集器,3个老年代垃圾收集器,以及G1,一共构成7种可供选择的垃圾收集器组合。html
新生代与老年代垃圾收集器之间造成6种组合,每一个新生代垃圾收集器都对应2种组合。java
JVM仅指定新生代垃圾收集器的状况下,默认老年代采用Serial Old垃圾收集器(带压缩):web
Serial (DefNew) + Serial Old(Serial Mark Sweep Compact)算法
Parallel (ParNew) + Serial Old(Serial Mark Sweep Compact)架构
Parallel Scavenge (PSYoungGen) + Serial Old(Serial Mark Sweep Compact (PSOldGen))并发
注:在Parallel Scavenge收集器架构中自己有PS MarkSweep收集器来进行老年代收集,但因为PS MarkSweep与Serial Old实现很是接近,所以官方的许多资料都直接以Serial Old代替PS MarkSweep进行讲解。oracle
Parallel Scavenge (PSYoungGen) + Parallel Mark Sweep Compact (ParOldGen)jvm
Serial (DefNew) + CMS(Concurrent Mark Sweep)ide
Parallel (ParNew) + CMS(Concurrent Mark Sweep) + Serial Old(Serial Mark Sweep Compact)性能
-XX:+UseG1GC
全部新生代垃圾收集器,都使用复制算法,都会发生stop-the-world。因为绝大多数对象的生命周期一般比较短,在新生代被回收的可能性很大,新生代的垃圾回收一般能够回收大部分对象,所以采用复制算法效率更高。
采用复制算法,GC时发生stop-the-world,使用单个GC线程。
"Serial" is a stop-the-world, copying collector which uses a single GC thread.
采用复制算法,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.
采用复制算法,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,都会在清理垃圾以后进行压缩整理。
采用标记整理算法,GC时发生stop-the-world,使用单个GC线程。
"Serial Old" is a stop-the-world, mark-sweep-compact collector that uses a single GC thread.
CMS采用标记清理算法,是一个以低暂停时间为目标的垃圾收集器。GC时大部分时间并发执行,其中初始化标记和从新标记两个阶段仍然会发生stop-the-world,其他阶段都是并发执行。
"CMS" is a mostly concurrent, low-pause collector.
Java之CMS GC的7个阶段:mp.weixin.qq.com/s/vmnBlrM7p…
采用标记整理算法,GC时发生stop-the-world,使用多个GC线程。
"Parallel Old" is a compacting collector that uses multiple GC threads.
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.
-XX:+UseConcMarkSweepGC(该参数隐式启用-XX:+UseParNewGC)
-XX:+UseParallelOldGC(该参数隐式启用-XX:+UseParallelGC)
参考
blog.ragozin.info/2016/10/hot…
《深刻理解Java虚拟机 JVM高级特性与最佳实践》周志明
《Java性能权威指南》
Java之CMS GC的7个阶段:mp.weixin.qq.com/s/vmnBlrM7p…
更多文章,请关注公众号:二进制之路