请列举Java虚拟机中主流的垃圾收集器,并简述各自适用的场景与特点。
考察说明
考查对JVM垃圾收集器家族及其适用场景的掌握程度。
回答思路
- 【回答框架 1】垃圾收集器是JVM内存管理的关键组件,按代际划分可分为年轻代和老年代收集器。常见的年轻代收集器有Serial、ParNew和Parallel Scavenge,老年代收集器有Serial Old、Parallel Old和CMS,以及G1、ZGC和Shenandoah等面向全堆的收集器。
- 【回答框架 2】Serial收集器单线程工作,适合客户端模式或小堆场景;ParNew是Serial的多线程版本,常与CMS搭配;Parallel Scavenge注重吞吐量,适合后台计算任务。CMS以低停顿为目标,采用标记-清除算法,但会产生内存碎片和并发阶段停顿。
- 【回答框架 3】G1将堆划分为多个Region,兼顾吞吐和停顿,可预测停顿时间,适合大堆场景。ZGC和Shenandoah追求极低停顿,通过染色指针和读屏障等技术实现,但内存占用和实现复杂度较高。
- 【回答框架 4】选择收集器需根据应用特点:若追求低延迟可考虑CMS或G1,若追求高吞吐可选Parallel,若内存极大且要求低停顿可考虑ZGC。同时JDK版本迭代会影响默认收集器,例如JDK9之后G1成为默认。
- 【关键点 1】Serial适用于单核或小堆,ParNew是多线程版,常配合CMS。
- 【关键点 2】CMS以低停顿为目标,采用标记-清除,存在碎片问题。
- 【关键点 3】G1基于Region,可预测停顿,适合大堆。
- 【关键点 4】ZGC和Shenandoah实现极低停顿,但复杂度高。
- 【关键点 5】Parallel收集器注重吞吐,适合计算密集型。
- 【易错点 1】误以为CMS是并发收集器就完全无停顿,实际仍有初始标记和重新标记等停顿。
- 【易错点 2】忽视CMS的碎片问题,可能导致Full GC频繁。
- 【易错点 3】认为G1一定比CMS好,实际上小堆场景下可能不如CMS或Serial。