垃圾回收器核心知识体系

垃圾回收器核心知识体系

目录

  1. 垃圾回收器组合关系
  2. 主流垃圾回收器详解
    2.1 Serial/SerialOld
    2.2 ParNew
    2.3 CMS
    2.4 Parallel Scavenge/Old
    2.5 G1
  3. 综合对比与选型建议
  4. 附录:核心参数速查

一、垃圾回收器组合关系

基础概念

  • 分代逻辑:除G1外,垃圾回收器需按年轻代+老年代组合使用
  • 组合矩阵(经典JDK8版本):
    年轻代选项
    Serial
    ParNew
    Parallel Scavenge
    可用老年代组合
    SerialOld
    SerialOld/CMS
    Parallel Old

二、主流垃圾回收器详解

2.1 Serial/SerialOld

核心特性
  • 工作模式:单线程串行回收
  • 代际归属
    • Serial:年轻代,使用复制算法
    • SerialOld:老年代,使用标记-整理算法
  • 适用场景:客户端程序/低配置设备(堆内存<100MB)
运行示意图
[用户线程] ----STW---> [Serial GC线程] ----STW---> [用户线程]
关键参数
-XX:+UseSerialGC  # 显式启用组合

2.2 ParNew

核心特性
  • 工作模式:多线程并行回收(Serial的多线程版本)
  • 代际归属年轻代,使用复制算法
  • 搭配组合CMS(JDK8前主流组合)
  • 适用场景:Web服务类应用
性能特点
  • 多CPU优势显著,单CPU反而不如Serial
  • JDK9后被标记为Deprecated
关键参数
-XX:+UseParNewGC          # 启用ParNew
-XX:ParallelGCThreads=4   # 指定线程数(默认为CPU核数)

2.3 CMS (Concurrent Mark Sweep)

核心特性
  • 设计目标最小化停顿时间(Low Latency)
  • 代际归属老年代,使用标记-清除算法
  • 适用场景:响应敏感的B/S系统(订单、交易等)
四阶段工作流
  1. 初始标记(Initial Mark):STW,标记GC Roots直接关联对象
    –> 耗时极短
  2. 并发标记(Concurrent Marking):与用户线程并发执行
    –> 耗时长但无STW
  3. 重新标记(Remark):STW,修正并发标记期间变化
    –> 通过增量更新/原始快照(SATB)优化
  4. 并发清除(Concurrent Sweep):异步清理死亡对象
缺陷与处理策略
问题类型现象解决方案
内存碎片Full GC频率增加开启压缩:-XX:+UseCMSCompactAtFullCollection
增量回收失败Concurrent Mode Failure后备方案:启用SerialOld
浮动垃圾堆积提早触发回收(JDK5默认68%)调整阈值:-XX:CMSInitiatingOccupancyFraction
关键参数
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=70  # 内存占用触发阈值

2.4 Parallel Scavenge/Parallel Old

核心特性
  • 设计哲学吞吐量优先(Throughput)
  • 适用场景:后台计算型任务(数据分析、批量处理)
代际划分
回收器代际算法
Parallel Scavenge年轻代复制算法
Parallel Old老年代标记-整理算法
自适应策略
设定MaxGCPauseMillis
JVM动态调整堆大小
设定GCTimeRatio
关键参数
-XX:+UseParallelGC       # Scavenge + Old组合
-XX:MaxGCPauseMillis=100 # 期望最大暂停时间(ms)
-XX:GCTimeRatio=99       # GC时间占比(公式:1/(1+N))

2.5 G1 (Garbage First)

核心突破
  1. Region划分:堆被划分为2048个等大Region(1MB~32MB)
  2. Mixed GC:统一管理年轻代/老年代,优先回收高收益Region
  3. 可预测暂停:通过-XX:MaxGCPauseMillis设置目标
内存模型
+---------------+ +---------------+ +---------------+
| Eden Region   | | Survivor      | | Old Region    |
| (年轻代)       | | Region        | | (含Humongous) |
+---------------+ +---------------+ +---------------+
核心流程
  • 年轻代GC(YGC)

    1. Evacuation阶段:存活对象拷贝到Survivor/Old
    2. 动态调整Eden/Survivor比例
  • 混合回收(Mixed GC)

    1. 初始标记:YGC时捎带完成(Piggybacking)
    2. 并发标记:SATB算法处理快照
    3. 最终标记:处理剩余引用
    4. 筛选回收:根据停顿预测选择Region
关键优化
  • Humongous Object:跨Region存储时直接进入老年代
  • RSet(Remembered Set):解决跨Region引用扫描
  • JDK12增强:支持自动返回未使用内存(-XX:+G1PeriodicGCInvokesConcurrent
典型参数
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:G1HeapRegionSize=16m

三、综合对比与选型建议

横评对比表

指标SerialParNew+CMSParallelG1
吞吐量低(单线程)中等高(大堆更优)
暂停时间中等可预测
内存开销高(RSet等)较高
JDK版本推荐<8(客户端)8(Web应用)8(计算密集型)≥9(默认)

版本演进指南

  • JDK8及之前

    • 响应优先:ParNew + CMS(需监控Full GC)
    • 吞吐优先:Parallel组合
    • 超大堆试验:G1(>-Xmx16G)
  • JDK11+

    • 默认G1,4G~16G堆平衡选择
    • 超低延迟需求:考虑ZGC(-XX:+UseZGC)
  • JDK17+

    • 生产级ZGC/Shenandoah
    • G1持续优化Region弹性和NUMA感知

四、附录:核心参数速查

通用参数

-XX:+PrintGCDetails        # 打印GC日志详情
-XX:+PrintGCDateStamps     # 日志中添加时间戳
-Xloggc:/path/to/gc.log    # 输出到独立文件

各回收器启用参数

回收器组合参数
Serial + SerialOld-XX:+UseSerialGC
ParNew + CMS-XX:+UseParNewGC -XX:+UseConcMarkSweepGC
Parallel组合-XX:+UseParallelGC
G1-XX:+UseG1GC
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王嘉俊925

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值