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

  • 工作过程
    1. 触发GC时,暂停所有用户线程(Stop-The-World)。
    2. 单线程执行标记-清除(Mark-Sweep)或标记-整理(Mark-Compact)算法。
  • 适用场景:Client模式或嵌入式设备。
  • JVM参数-XX:+UseSerialGC

2.2 Parallel GC(吞吐量优先)

  • 工作过程
    1. 年轻代使用并行复制算法(Parallel Copying),多线程回收。
    2. 老年代使用标记-整理(Mark-Compact)算法。
  • 特点:通过多线程提升回收速度,但仍有Stop-The-World停顿。
  • JVM参数-XX:+UseParallelGC

2.3 CMS(Concurrent Mark-Sweep)

  • 目标:最小化停顿时间,分为4个阶段:
    1. 初始标记(Initial Mark):标记GC Roots直接关联的对象(需STW)。
    2. 并发标记(Concurrent Mark):遍历对象图,与用户线程并发执行。
    3. 重新标记(Remark):修正并发标记期间变动的对象(需STW)。
    4. 并发清除(Concurrent Sweep):清理垃圾对象。
  • 缺点:产生内存碎片,可能触发Full GC。
  • JVM参数-XX:+UseConcMarkSweepGC

2.4 G1(Garbage-First)

  • 核心思想:将堆划分为多个等大的Region(默认2048个),优先回收垃圾最多的区域。
  • 工作过程
    1. 年轻代回收:复制存活对象到Survivor区或老年代Region。
    2. 混合回收(Mixed GC):同时回收年轻代和部分老年代Region。
    3. 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调优的基础。

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. 实战调优参数示例 5. 总结 垃圾回收器的选择需权衡 吞吐量 、 延迟 和 内存开销 。现代应用(如微服务)通常优先选择G1或ZGC,而传统批处理任务可能更适合Parallel GC。理解不同回收器的工作机制,是JVM调优的基础。