新生代垃圾回收器 | 老年代垃圾回收器 | |
---|---|---|
serialGC | serial | serial old |
parallelGC | parallel Scavenge | parallel old |
CMS GC | par New | CMS |
G1 |
serialGC:新生代内存不足,使用serial垃圾回收器并且使用标记复制算法,对新生代进行minorGc,老年代内存不足,使用serialOld垃圾回收器并且使用标记整理算法对整个堆进行fullGc。采用单线程垃圾回收
parallelGC:新生代内存不足,使用parallel Scavenge进行垃圾回收并且使用的是标记复制算法进行minorGc,老年代内存不足,使用的是parallel old垃圾回收器基于标记整理算法进行垃圾回收。采用的是多线程垃圾回收
CMS GC: 新生代内存不足,使用的是par New 垃圾回收器基于标记复制算法进行垃圾回收。老年代内存不足,使用的是CMS垃圾回收器基于标记清除算法进行垃圾回收,如果空间碎片比较严重的时候,会基于标记整理进行回收。整个过程一直都是一种并发清除的过程,如果老年代严重不足了,就会STW,使用serial Old 垃圾回收器进行单线程垃圾回收(标记-整理算法)
G1:
G1回收步骤:
- 新生代垃圾回收:新生代内存不足,进行新生代的垃圾回收。使用的是标记复制算法。经过一段时间垃圾回收,一些存活时间长的对象就会进入到老年代region区。对于大对象,G1有独自的humongous区用来存活大对象。(如果对象大小超过了Region区的50%则视为大对象进入大对象区)
- 在新生代垃圾回收过程中会同时进行初始化标记Root对象,在新生代垃圾回收结束后会进行并发标记。
- 混合垃圾回收:当老年代内存不足时候,就会进行新生代和老年代以及大对象区的全面回收。该阶段一旦触发,就会进入STW阶段,可以通过设置混合回收的停顿时间,为了保证这个停顿时间,JVM会从新生代、老年代、大对象H区挑选一部分进行垃圾回收,分多次进行回收。
- FullGC:无论是新生代还是老年代的垃圾回收都是基于复制算法,需要将Resion区的存活对象复制到另一个Region区,如果没有空闲的Region区了就会触发一次失败,进行FullGc,FullGc使用的是SerialOld垃圾回收器基于标记整理算法,且是单线程,停顿时间长