上图为虚拟机包含的所有垃圾收集器。
新生代:新生代采用的是“复制算法”
- Serial:单线程,新生代
- 串行收集器是最古老,最稳定以及效率高的收集器,可能会产生较长的停顿,只使用一个线程去回收
- 新生代、老年代使用串行回收
- 新生代复制算法
- 老年代标记-压缩
- -XX:+UseSerialGC
- ParNew: 多线程,新生代
- Serial收集器新生代的并行版本,在新生代回收时使用复制算法,多线程,需要多核支持
- -XX:+UseParNewGC(new代表新生代,所以适用于新生代)
- -XX:ParallelGCThreads 限制线程数量
- Parallel Scavenge:多线程,新生代,关注吞吐量,允许较长的STW(Stop the world)换取吞吐量最大化
- 类似ParNew ,新生代复制算法,老年代标记-压缩,更加关注吞吐量
- -XX:+UseParallelGC 使用Parallel收集器+ 老年代串行
- -XX:+UseParallelOldGC 使用Parallel收集器+ 老年代并行
老年代:老年代采用的是“标记-清除-整理”算法
- Serial Old: 单线程,Serial的老年代版本
- Parallel Old:多线程,Parallel Scavenge的老年代版本,关注吞吐量
- CMS:多线程,标记-清除算法,关注停顿时间,可以与Serial和ParNew配合。
其它:
- G1:同时负责新生代和老年代,是目前一段时间主流的垃圾收集器(JDK 9 到 11 的默认垃圾收集器)。
- ZGC:在大堆下也可以控制STW时间极短(几毫秒内),在JDK 11 为实验阶段。
Java 各版本模式默认是用的什么垃圾收集器?
- 在JDK7,默认是Parallel Scavenge + Serial Old。
- 在JDK 8 及JDK 7u4之后的版本,默认是Parallel Scavenge + Parallel Old。
- 在JDK 9 到JDK 11,默认是G1
垃圾收集器参数总结
备注
串行收集器(Serial Collector)
并行收集器(Parallel Collector)
并发标记清除收集器(Concurrent Mark Sweep Collector,CMS