JVM垃圾回收器

一、新生代回收器

1. Serial 收集器
  • 目标代际:新生代

  • 回收算法:标记-复制算法

  • 工作模式:

    • 单线程执行垃圾回收

    • STW暂停所有应用线程

  • 特点:

    • 简单高效(无线程交互开销)

    • 暂停时间长(不适合服务端)

  • 启用参数 :-XX:+UseSerialGC

2. ParNew 收集器
  • 目标代际:新生代

  • 回收算法:标记-复制算法

  • 工作模式:

    • 多线程并行回收(默认=CPU核心数)

    • STW暂停所有线程

  • 特点:

    • Serial的多线程版本

    • 需配合CMS使用(老年代回收器)

  • 启用参数 :-XX:+UseParNewGC

3. Parallel Scavenge 收集器
  • 目标代际:新生代

  • 回收算法:标记-复制算法

  • 工作模式:

    • 多线程并行回收

    • 自适应策略动态调整堆参数

  • 特点:

    • 吞吐量优先:最大化应用运行时间

    • 提供精确控制参数:-XX:GCTimeRatio、-XX:MaxGCPauseMillis

  • 启用参数 :-XX:+UseParallelGC


二、老年代回收器

4. Serial Old 收集器
  • 目标代际:老年代

  • 回收算法:标记-整理算法

  • 工作模式:

    • 单线程执行

    • 全STW暂停

  • 特点:

    • Serial收集器的老年代版本

    • 作为CMS失败时的后备方案

  • 启用参数 :-XX:+UseSerialGC

5. Parallel Old 收集器
  • 目标代际:老年代

  • 回收算法:标记-整理算法

  • 工作模式:

    • 多线程并行回收

    • 全STW暂停

  • 特点:

    • Parallel Scavenge的老年代搭档

    • 吞吐量优先设计

  • 启用参数 :-XX:+UseParallelOldGC

6. CMS 收集器(Concurrent Mark-Sweep)
  • 目标代际:老年代

  • 回收算法:标记-清除算法

  • 四阶段工作流:

    1. 初始标记:STW暂停,标记GC Roots直接引用

    2. 并发标记:与应用线程并行,标记引用链

    3. 重新标记:STW暂停,修正并发标记变更

    4. 并发清除:与应用线程并行,回收垃圾内存

  • 特点:

    • 低延迟优先:减少STW时间

    • 内存碎片问题(需定期Full GC整理)

    • 并发失败风险(Concurrent Mode Failure)

  • 启用参数 :-XX:+UseConcMarkSweepGC


三、全堆回收器

7. G1 收集器(Garbage-First)
  • 目标代际:新生代 + 老年代(全堆)

  • 核心设计:

    • 分区模型:将堆划分为2048个等大Region(1MB~32MB)

    • 回收策略:

      • 年轻代回收:STW暂停,复制算法

      • 混合回收:回收老年代高收益Region

      • Full GC:Serial Old作为后备

  • 四阶段标记:

    1. 初始标记:STW,标记GC Roots

    2. 并发标记:并行标记引用链

    3. 最终标记:STW,处理SATB队列

    4. 筛选回收:STW,按价值排序回收Region

  • 特点:

    • 可预测停顿 :-XX:MaxGCPauseMillis=200

    • 内存整理:避免碎片

    • JDK9+默认回收器

  • 启用参数 :-XX:+UseG1GC


四、回收器搭配与代际关系

回收器组合 新生代 老年代 启用参数
Serial + Serial Old Serial Serial Old -XX:+UseSerialGC
ParNew + CMS ParNew CMS -XX:+UseParNewGC -XX:+UseConcMarkSweepGC
Parallel Scavenge + Parallel Old Parallel Scavenge Parallel Old -XX:+UseParallelGC -XX:+UseParallelOldGC
G1 内置年轻代模式 内置老年代模式 -XX:+UseG1GC

五、常见问题总结

Q:Serial收集器如何工作?

A:

  • 目标代际:新生代

  • 算法:标记-复制算法

  • 流程:

    1. STW暂停所有线程

    2. 单线程标记存活对象

    3. 存活对象复制到Survivor区

    4. 年龄+1,超阈值晋升老年代

    5. 清空Eden和From Survivor

  • 特点:简单高效,适合客户端应用

Q:CMS的四个阶段是什么?

A:

  • 初始标记:STW暂停,标记GC Roots直接引用(快)

  • 并发标记:与应用并行,遍历对象图(长)

  • 重新标记:STW暂停,修正并发期间变更(中)

  • 并发清除:与应用并行,回收垃圾内存(长)

Q:G1如何实现可预测停顿?

A: 三步机制:

  1. 堆分区:划分为等大Region(默认2048个)

  2. 回收价值计算:优先回收垃圾最多(Garbage-First)Region

  3. 停顿预测模型:基于历史GC数据预测回收时间


六、关键概念解析

  1. STW(Stop-The-World) :

    垃圾回收时暂停所有应用线程,保证一致性

  2. 晋升阈值(Tenuring Threshold) :

    对象从新生代晋升老年代的年龄(默认15次GC)

  3. SATB(Snapshot-At-The-Beginning) :

    G1在并发标记开始时建立对象图快照,解决漏标问题

  4. 记忆集(Remembered Set) :

    记录Region间引用关系,避免全堆扫描(G1核心数据结构)

相关推荐
Joy T3 小时前
Agent 确定性上下文设计:从 Prompt 参数注入到能力分层
java·开发语言·微服务·架构·prompt·agent context
m0_587383006 小时前
广州 24 小时自助健身房解决方案技术实现与实战指南
java·spring·小程序·架构·需求分析
·云扬·6 小时前
Prompt 工程与安全:从 System 设计到注入防御
java·人工智能·安全·ai·prompt
专注仿真6 小时前
引擎扩展性与集成设计深度剖析:从 14 个扩展点到 DIS→HLA 演进之路
开发语言·算法·仿真引擎·推演引擎
Best-Wishes7 小时前
科来网络分析系统(技术交流版)使用说明书
开发语言·junit·php
代码不停7 小时前
自动化测试(java)
java·开发语言·selenium·自动化
鬼手点金9 小时前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
爱上网的小舟9 小时前
星际战士2启动错误怎么办?5种游戏报错解决方法
开发语言·php
paopaokaka_luck10 小时前
滑雪场管理系统(AI智能助手流式对话,ECharts 运营数据分析、教练、雪具与场地一体化预约,钱包支付退款、订单核销与服务评价)
java·人工智能·spring boot·网络协议·数据分析·echarts
阿里嘎多学长10 小时前
2026-10-12 GitHub 热点项目精选
开发语言·程序员·github·代码托管