零基础学习性能测试第五章:JVM性能分析与调优-垃圾回收器的分类与回收

目录

以下是针对零基础学习者的 JVM垃圾回收器分类与回收机制 终极解析,结合可视化模型与实战对比,助你彻底掌握不同回收器的核心差异与选型策略:


一、垃圾回收器分类三维图

垃圾回收器 线程模式 内存区域 算法类型 单线程 多线程并行 多线程并发 新生代 老年代 全堆 标记-复制 标记-清除 标记-整理


二、7大经典回收器对比表(核心特性+适用场景)

回收器 分代 线程模式 算法 适用场景 STW时间 启用参数
Serial 新生代 单线程 复制 客户端程序/小内存 -XX:+UseSerialGC
ParNew 新生代 并行 复制 CMS搭档 -XX:+UseParNewGC
Parallel Scavenge 新生代 并行 复制 吞吐量优先应用 -XX:+UseParallelGC
Serial Old 老年代 单线程 标记-整理 Client模式 默认启用
Parallel Old 老年代 并行 标记-整理 吞吐量优先应用 -XX:+UseParallelOldGC
CMS 老年代 并发 标记-清除 Web服务/低延迟系统 低(但存在浮动垃圾) -XX:+UseConcMarkSweepGC
G1 全堆 并发 分区+标记-整理 大内存(6G+)/平衡吞吐与延迟 可预测 -XX:+UseG1GC
ZGC 全堆 并发 着色指针+读屏障 超大堆(TB级)/极致低延迟 <10ms -XX:+UseZGC
Shenandoah 全堆 并发 转发指针 低延迟/大堆 <10ms -XX:+UseShenandoahGC

📌 核心选择标准

  • 吞吐量优先 → Parallel Scavenge + Parallel Old
  • 低延迟优先 → G1/ZGC/Shenandoah
  • 小内存 → Serial + Serial Old

三、回收器工作机制图解

1. Serial回收器 - "单线程保洁员"

应用线程 Serial GC Eden区满 暂停所有线程(STW) 单线程标记存活对象 复制到Survivor区 恢复运行 应用线程 Serial GC

特点:简单高效无竞争,但STW时间长


2. CMS回收器 - "低延迟专家"

初始标记 STW 并发标记 重新标记 STW 并发清除

四步过程

  1. 初始标记:标记GC Roots直接关联对象(STW短)
  2. 并发标记:遍历对象图(与用户线程并发)
  3. 重新标记:修正并发标记变动(STW中)
  4. 并发清除:清理垃圾对象(并发)

致命缺陷:内存碎片 + 并发模式失败(Concurrent Mode Failure)


3. G1回收器 - "分区回收大师"

G1堆结构 Region2 Region1 Region4 Region3 Region2048 ... 回收过程 初始标记 STW 并发标记 最终标记 STW 筛选回收 STW

核心创新

  • 将堆划分为等长Region(默认2048个)
  • 优先回收价值最大的Region(垃圾比例高)
  • 可预测停顿模型-XX:MaxGCPauseMillis=200

4. ZGC回收器 - "TB级堆的极速王者"

并发标记 并发预备重分配 并发重分配 并发重映射

三大黑科技

  1. 着色指针:在指针中存储对象状态信息
  2. 读屏障:动态修正对象引用
  3. 内存映射:支持TB级堆,STW<10ms

适用场景:云原生/大数据/实时交易系统


四、不同场景回收器选型指南

场景1:电商大促系统(8核16G)
bash 复制代码
# 目标:平衡吞吐与延迟
-XX:+UseG1GC 
-XX:MaxGCPauseMillis=200 
-XX:G1HeapRegionSize=4m
场景2:金融交易系统(低延迟要求)
bash 复制代码
# 亚毫秒级暂停
-XX:+UseZGC 
-XX:+ZGenerational  # JDK21+启用分代ZGC
-Xmx32g
场景3:数据分析批处理(吞吐优先)
bash 复制代码
# 最大化计算资源利用率
-XX:+UseParallelGC 
-XX:ParallelGCThreads=8 
-XX:GCTimeRatio=99  # GC时间占比<1%

五、调优实战案例:日活百万的APP后端优化

问题现象
  • 高峰期API延迟飙升至2秒
  • CMS频繁发生Concurrent Mode Failure
优化过程
  1. 诊断工具

    bash 复制代码
    # 发现老年代碎片率45%
    jmap -heap <pid>
    
    # GC日志显示:
    [CMS-concurrent-mark: 1.234/2.345 secs]
    [CMS Failure: Allocation Failure]
  2. 切换回收器

    bash 复制代码
    # 从CMS迁移到G1
    -XX:+UseG1GC 
    -XX:MaxGCPauseMillis=150
    -XX:G1HeapRegionSize=4m
  3. 结果对比

    指标 CMS G1 提升幅度
    平均延迟 1240ms 230ms 81%↓
    99%延迟 3560ms 450ms 87%↓
    Full GC次数 12次/小时 0次 100%↓

六、新一代回收器对比(ZGC vs Shenandoah)

特性 ZGC(Oracle) Shenandoah(RedHat)
最大堆 16TB 16TB
暂停时间 <10ms <10ms
分代支持 JDK21+(-XX:+ZGenerational) 暂不支持
内存开销 15-20% 10-15%
压缩指针 必须启用 可选
适用JDK JDK11+ JDK8u/11/17

💡 选型建议

  • OpenJDK环境 → Shenandoah(兼容性更好)
  • Oracle JDK → ZGC(官方支持更强)

七、回收器参数优化模板

G1调优模板(16G堆):
bash 复制代码
-XX:+UseG1GC
-Xms12g -Xmx12g
-XX:MaxGCPauseMillis=200       # 目标暂停时间
-XX:G1HeapRegionSize=4m        # 区域大小
-XX:InitiatingHeapOccupancyPercent=45 # 老年代占比45%触发GC
-XX:ConcGCThreads=4            # 并发线程数
-XX:G1ReservePercent=15        # 保留内存防晋升失败
ZGC调优模板(大内存):
bash 复制代码
-XX:+UseZGC
-Xms24g -Xmx24g
-XX:ConcGCThreads=8            # 并发线程数
-XX:SoftMaxHeapSize=20g        # 动态堆调整上限
-XX:+ZProactive                # 主动触发回收
-XX:+ZGenerational             # JDK21+启用分代

八、终极选型决策树

避坑指南

  1. CMS在JDK14被废弃,JDK17移除 → 勿在新项目使用
  2. G1的-XX:MaxGCPauseMillis只是目标值,非硬承诺
  3. ZGC在JDK21前无分代 → 年轻代回收效率低

通过本指南,您将掌握:

✅ 主流回收器核心工作机制

✅ 不同场景下的选型策略

✅ 关键参数优化技巧

✅ 避免回收器选型误区

✅ 应对高并发低延迟的终极方案

立即行动 :使用命令java -XX:+PrintFlagsFinal -version | grep GC 查看当前JVM默认回收器!

相关推荐
遇见尚硅谷3 小时前
C语言:*p++与p++有何区别
c语言·开发语言·笔记·学习·算法
艾莉丝努力练剑4 小时前
【数据结构与算法】数据结构初阶:详解排序(二)——交换排序中的快速排序
c语言·开发语言·数据结构·学习·算法·链表·排序算法
jz_ddk4 小时前
[HarmonyOS] 鸿蒙LiteOS-A内核深度解析 —— 面向 IoT 与智能终端的“小而强大”内核
物联网·学习·华为·harmonyos
试着4 小时前
零基础学习性能测试第五章:Tomcat的性能分析与调优-Tomcat原理,核心配置项,性能瓶颈分析,调优
学习·零基础·tomcat·性能测试
老虎06275 小时前
JavaWeb(苍穹外卖)--学习笔记13(微信小程序开发,缓存菜品,Spring Cache)
笔记·学习·微信小程序
@蓝莓果粒茶6 小时前
LeetCode第350题_两个数组的交集II
c++·python·学习·算法·leetcode·职场和发展·c#
无名工程师6 小时前
AI 学习过程中各阶段的学习重点、时间规划以及不同方向的选择与建议等内容
人工智能·学习
笠码7 小时前
JVM Java虚拟机
java·开发语言·jvm·垃圾回收
livemetee7 小时前
Flink2.0学习笔记:Stream API 常用转换算子
大数据·学习·flink