一、Minor GC、Major GC 和 Full GC
Minor GC:清理新生代空间,当Eden空间不能分配时候引发Minor GC
Major GC:清理老年代空间
Full GC:清理Java堆空间
二、新生代垃圾收集器
1. Serial 收集器
线程:单线程收集器,
算法:新生代标记复制,老年代标记整理
缺点:在进行垃圾收集时候需要停止所有用户线程(STW)
优点:没有线程交互开销
2. ParNew 收集器
在Serial收集器上进行改进,将GC改成了多线程,其他的包括Serial可用的所有控制参数、收集算法、STW、对象分配规则、回收策略等都与Serial完全一样。
3. Parallel Scavenge 收集器
算法:复制算法
线程:多线程
关注点:系统吞吐量
系统吞吐量=运行用户代码时间(运行用户代码时间+垃圾收集时间)
三、老年代垃圾收集器
1. Serial Old 收集器
Serial Old 是Serial 的老年代版本
线程:单线程
2. Parallel Old 收集器
Parallel Old 是 Parallel Scavenge 的收集器老年代版本,
3. CMS(Concurrent Mark Sweep 并发标记清理)收集器
线程:多线程
算法:标记清理
步骤
1)初始标记:标记GC Root 能直接关联到的对象
2)并发标记:GC Root Tracing 过程
3)重新标记:标记并发期间Java程序产生的对象
4)并发清除:清理垃圾
缺点:
1)对CPU敏感,虽然不会停止CPU,但是会占用部分CPU资源
2)无法处理浮动垃圾(在初始标记之后,并发标记时候产生的垃圾),只能留着下次清理
3)大量的空间碎片
4. G1 收集器
优势:
1)并行与并发
2)分代收集
3)空间整合
4)可预测停顿
步骤:
1)初始标记
2)并发标记
3)最终标记(修正并发标记期间用户继续运作导致标记变动的一部分记录)
4)筛选回收