主题切换
常见垃圾回收器
HotSpot虚拟机主流四款垃圾回收器:串行收集器Serial、并行收集器Parallel、CMS并发收集器、G1收集器,分代搭配不同算法,适配不同业务场景。
一、串行垃圾收集器 Serial / Serial Old
1. 分区搭配与算法
- Serial:新生代收集器,复制算法;
- Serial Old:老年代收集器,标记整理算法。
2. 运行特点
全程单线程执行GC,所有GC阶段都会触发STW,暂停全部用户线程。
3. 适用场景
堆内存小、单核CPU环境,客户端本地程序,JDK客户端模式默认收集器。
二、并行垃圾收集器 ParNew / Parallel Old
1. 分区搭配与算法
- ParNew:新生代,复制算法;
- Parallel Old:老年代,标记整理算法;JDK8默认垃圾回收组合。
2. 运行特点
GC阶段使用多线程并行回收,但整个回收过程全程STW,侧重吞吐量。
3. 适用场景
后台批处理、数据计算类程序,追求高吞吐量,可承受较长STW停顿。
三、CMS并发收集器(Concurrent Mark Sweep)
1. 分区与算法
仅作用于老年代,底层采用标记清除算法,会产生内存碎片。
2. 四大执行阶段
- 初始标记:短暂STW,标记GC Roots直接引用对象;
- 并发标记:GC线程与用户线程同时运行,遍历全部引用链;
- 重新标记:短暂STW,修正并发阶段新产生的垃圾对象;
- 并发清理:GC与用户线程并发执行,回收垃圾。
3. 优缺点
优点:大部分阶段并发执行,STW停顿极短,追求低延迟; 缺点:标记清除产生内存碎片、占用CPU资源高、并发阶段存在浮动垃圾。
4. 适用场景
互联网高并发低延迟业务,JDK9后逐步被G1替代。
四、G1垃圾收集器
1. 分区特点
不严格区分新生代、老年代,将整个堆划分为多个同等大小Region,可同时管理新生代与老年代。
2. 核心特性
支持Mixed GC,一次回收全部新生代+部分老年代分区,可自定义预期停顿时间,平衡吞吐量与延迟。
3. 适用场景
大堆内存服务端应用,JDK9默认垃圾回收器。
五、面试简答
问:JVM有哪些常见垃圾回收器,分别简单说明特点?
答:
- Serial串行收集器:单线程GC,全程STW,适合小内存客户端程序;
- Parallel并行收集器:多线程并行回收,侧重吞吐量,JDK8默认,适合批处理任务;
- CMS并发收集器:老年代专用,标记清除,大部分阶段并发,STW短,存在内存碎片;
- G1收集器:堆分Region,兼顾新生代老年代,可控停顿,JDK9默认,适合大堆线上服务。