年轻代的垃圾收集器包含: Serial、ParNew、Parallell
老年代则包括Serial Old老年代版本、CMS、Parallel Old老年代版本和JDK11中的G1收集器。
- Serial:单线程版本收集器,进行垃圾回收的时候会STW(Stop The World),也就是进行垃圾回收的时候其他的工作线程都必须暂停
- ParNew:Serial的多线程版本,用于和CMS配合使用
- Parallel Scavenge:可以并行收集的多线程垃圾收集器
- Serial Old:Serial的老年代版本,也是单线程
- Parallel Old:Parallel Scavenge的老年代版本
- CMS(Concurrent Mark Sweep):CMS收集器是以获取最短停顿时间为目标的收集器,相对于其他的收集器STW的时间更短暂,可以并行收集是他的特点,同时他基于标记-清除算法,整个GC的过程分为4步。
初始标记:标记GC ROOT能关联到的对象,需要STW
并发标记:从GCRoots的直接关联对象开始遍历整个对象图的过程,不需要STW
重新标记:为了修正并发标记期间,因用户程序继续运作而导致标记产生改变的标记,需要STW
并发清除:清理删除掉标记阶段判断的已经死亡的对象,不需要STW
从整个过程来看,并发标记和并发清除的耗时最长,但是不需要停止用户线程,而初始标记和重新标记的耗时较短,但是需要停止用户线程,总体而言,整个过程造成的停顿时间较短,大部分时候是可以和用户线程一起工作的。
G1(Garbage First):G1收集器是JDK9的默认垃圾收集器,而且不再区分年轻代和老年代进行回收。
G1的回收过程分为以下四个步骤:
初始标记:标记GC ROOT能关联到的对象,需要STW
并发标记:从GCRoots的直接关联对象开始遍历整个对象图的过程,扫描完成后还会重新处理并发标记过程中产生变动的对象
最终标记:短暂暂停用户线程,再处理一次,需要STW
筛选回收:更新Region的统计数据,对每个Region的回收价值和成本排序,根据用户设置的停顿时间制定回收计划。再把需要回收的Region中存活对象复制到空的Region,同时清理旧的Region。需要STW