GC总览
Java是一门面向对象的语言。在使用Java的过程中,会创建大量的对象在内存中。而这些对象,需要在用完之后“回收”掉,释放内存资源。这件事我们称它为垃圾收集(Garbage Collection,简称GC),而实际执行者就是各种各样的“垃圾收集器”(Garbage Collector,以下也简称GC)。
为什么会有各种各样的GC?因为时代在发展,以前的GC可能不能满足现在的需求,所以就会有源源不断的GC推出来。先来看一下都有哪些主流的GC:
新生代:
Serial:单线程,新生代;
ParNew: 多线程,新生代;
Parallel Scavenge:多线程,新生代,关注吞吐量;
老年代:
Serial Old: 单线程,Serial的老年代版本;
Parallel Old:多线程,Parallel Scavenge的老年代版本,关注吞吐量;
CMS:多线程,标记-清除算法,关注停顿时间,可以与Serial和ParNew配合。
其它
G1:同时负责新生代和老年代,是目前一段时间主流的垃圾收集器(JDK 9到现在JDK 16的默认垃圾收集器)。
ZGC:在大堆下也可以控制STW时间极短(几毫秒内),在JDK 11 为实验阶段,在JDK 15转正。Oracle发起,2017年贡献给OpenJDK。
Shenandoah GC:停顿时间极短,在JDK 12为试验阶段,在JDK 15转正。Red Hat发起,与ZGC和G1是竞争关系。
STW: Stop The World,指的是停止用户线程。GC应该尽量避免STW或者缩减STW的时间。
各JDK版本默认GC
下面来看一下从JDK 7开始在默认GC(JDK 7之前的,我就不考古了,现在大家项目上用的也少)。
- 在JDK 7,默认是Parallel Scavenge + Serial Old。
- 在JDK 8 及JDK 7u4之后的版本,默认是Parallel Scavenge + Parallel Old。
- 在JDK 9 到JDK 16,默认是G1
严格来说之前的版本应该是JDK 1.7, JDK 1.8,这里及下文为了表述方便,我就写成了JDK 7, JDK 8。