垃圾收集器概述
垃圾收集器组合
- 图中展示了7种垃圾收集器,Serial、ParNew、Parallel Scavenge、CMS、Serial old、Parallel Old、G1
- 带有连线的收集器代表可以组合使用
- Serial Old作为CMS出现"Concurrent Mode Failure"失败的后备预案
并发垃圾收集和并行垃圾收集的区别
- 并行指多条垃圾收集线程并行执行,但是用户线程需要等待,即进入stop the world状态,对应的垃圾收集器有ParNew、Parallel Old、Parallel Scavenge。
- 并发指用户线程和垃圾收集线程同时执行,不一定是同时执行,可能是交替执行,对应的垃圾收集器有CMS、G1。
Minor GC和Full GC
Minor GC表示新生代垃圾收集,Full GC表示新生代和老年代垃圾收集,Major GC表示老年代垃圾收集。
Serial收集器
- 特点
- 针对新生代、采用复制算法、单线程收集
- 进行垃圾收集是会暂停所有的工作线程
Serial/Serial Old组合收集器运行示意图如下:
- 应用场景
- HotSpot在client模式下默认的新生代垃圾收集器
- 对于限定单个CPU的环境来说,Serial收集器没有线程交互(切换)开销,可以获得最高的单线程收集效率
- 设置参数
- “-XX:+UseSerialGC”:添加该参数来显式的使用串行垃圾收集器。
ParNew收集器
- 特点
- 针对新生代、采用复制算法、多线程收集
- 进行垃圾收集时会停止所有的用户线程
ParNew/Serial Old组合收集器运行示意图如下:
- 应用场景
- 在Server模式下,ParNew收集器是一个非常重要的新生代收集器,因为除Serial外,目前只有它能与CMS收集器配合工作。
- 但在单个CPU环境中,不会比Serail收集器有更好的效果,因为存在线程交互开销。
- 设置参数
- “-XX:+UseConcMarkSweepGC”:指定使用CMS后,会默认使用ParNew作为新生代收集器
- “-XX:+UseParNewGC”:强制指定使用ParNew
- “-XX:ParallelGCThreads”:指定垃圾收集的线程数量,ParNew默认开启的收集线程与CPU的数量相同
- 为什么只有ParNew能与CMS收集器配合?
- CMS是HotSpot在JDK1.5推出的第一款真正意义上的并发(Concurrent)收集器,第一次实现了让垃圾收集线程与用户线程(基本上)同时工作;CMS作为老年代收集器,但却无法与JDK1.4已经存在的新生代收集器Parallel Scavenge配合工作;因为Parallel Scavenge(以及G1)都没有使用传统的GC收集器代码框架,而另外独立实现;而其余几种收集器则共用了部分的框架代码;