Java中的JVM垃圾回收器详解
字数 1467 2025-11-06 12:41:12
Java中的JVM垃圾回收器详解
1. 垃圾回收器的作用与分类
垃圾回收器(Garbage Collector, GC)是JVM的核心组件,负责自动管理堆内存的分配与回收,避免内存泄漏。根据工作模式,垃圾回收器可分为以下几类:
- 串行回收器(Serial GC):单线程执行垃圾回收,适用于内存小、CPU核心少的场景。
- 并行回收器(Parallel GC):多线程并行回收,追求高吞吐量(适合后台计算任务)。
- 并发回收器(Concurrent GC):垃圾回收线程与用户线程并发执行,减少停顿时间(适合响应式应用)。
- G1(Garbage-First)回收器:面向大堆内存,将堆划分为多个区域(Region),通过预测停顿时间优化回收。
- ZGC/Shenandoah:新一代低延迟回收器,停顿时间不超过10ms(JDK11+)。
2. 常见垃圾回收器的工作原理
2.1 Serial GC
- 工作过程:
- 触发GC时,暂停所有用户线程(Stop-The-World)。
- 单线程执行标记-清除(Mark-Sweep)或标记-整理(Mark-Compact)算法。
- 适用场景:Client模式或嵌入式设备。
- JVM参数:
-XX:+UseSerialGC
2.2 Parallel GC(吞吐量优先)
- 工作过程:
- 年轻代使用并行复制算法(Parallel Copying),多线程回收。
- 老年代使用标记-整理(Mark-Compact)算法。
- 特点:通过多线程提升回收速度,但仍有Stop-The-World停顿。
- JVM参数:
-XX:+UseParallelGC
2.3 CMS(Concurrent Mark-Sweep)
- 目标:最小化停顿时间,分为4个阶段:
- 初始标记(Initial Mark):标记GC Roots直接关联的对象(需STW)。
- 并发标记(Concurrent Mark):遍历对象图,与用户线程并发执行。
- 重新标记(Remark):修正并发标记期间变动的对象(需STW)。
- 并发清除(Concurrent Sweep):清理垃圾对象。
- 缺点:产生内存碎片,可能触发Full GC。
- JVM参数:
-XX:+UseConcMarkSweepGC
2.4 G1(Garbage-First)
- 核心思想:将堆划分为多个等大的Region(默认2048个),优先回收垃圾最多的区域。
- 工作过程:
- 年轻代回收:复制存活对象到Survivor区或老年代Region。
- 混合回收(Mixed GC):同时回收年轻代和部分老年代Region。
- Full GC(备用方案):当回收速度跟不上分配速度时,退化为串行GC。
- 优势:可预测的停顿时间模型(通过
-XX:MaxGCPauseMillis设置)。 - JVM参数:
-XX:+UseG1GC
3. 如何选择垃圾回收器?
- 追求高吞吐量:Parallel GC(例如批量处理任务)。
- 要求低延迟:CMS(JDK8及之前)或G1(JDK9+默认)。
- 超大堆内存(超过16GB):G1或ZGC/Shenandoah。
- 极致低停顿(毫秒级):ZGC(JDK15+成熟)或Shenandoah。
4. 实战调优参数示例
# 使用G1并设置最大停顿时间
java -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Xmx4g MyApp
# 使用Parallel GC并指定线程数
java -XX:+UseParallelGC -XX:ParallelGCThreads=4 -Xmx2g MyApp
5. 总结
垃圾回收器的选择需权衡吞吐量、延迟和内存开销。现代应用(如微服务)通常优先选择G1或ZGC,而传统批处理任务可能更适合Parallel GC。理解不同回收器的工作机制,是JVM调优的基础。