垃圾回收算法(Garbage Collection)深度解析

垃圾回收算法(Garbage Collection)深度解析

核心思想

  • 垃圾回收核心目标:
    • 定位存活对象 、回收死亡对象
    • 可达性分析算法、空间复用优化

生死判定原理

  • 可达性分析法(Reachability Analysis)
    通过GC Roots(栈变量、静态变量、JNI引用等)构建引用链,未连接的对象视为垃圾

算法评价三维度

指标定义关键影响因素
吞吐量用户代码执行时间占比GC频率、单次GC耗时
最大暂停时间单次STW最长持续时间内存整理算法选择、堆大小
堆使用效率有效内存空间占比算法内存管理机制(碎片化程度)

黄金三角定律:三者无法同时最优,需根据场景权衡
(缓存系统追求高吞吐、实时系统优先低延迟、嵌入式设备需高内存效率)


经典算法矩阵

1. 标记-清除(Mark-Sweep)

算法流程

标记阶段 清除阶段 从GC Roots遍历标记 传递标记位图 线性扫描清理未标记区域 标记阶段 清除阶段

优势:

  • 内存利用率100%(不预留空间)
  • 无对象迁移开销

缺陷:

  • 内存碎片化(外部碎片)
  • 双指针遍历内存的低效性
  • "致命50%"现象(整体复制性能更好)

2. 复制算法(Copying)

半区复制原理

// 伪代码示例
void collecting() {
    for (LiveObject obj : fromSpace) {
        copyTo(obj, toSpace);   // 复制存活对象
        forwardPtr(obj);        // 更新引用指针
    }
    swap(fromSpace, toSpace);   // 空间角色互换
}

优势:

  • 消除内存碎片
  • 顺序分配的高效性(指针碰撞)
  • 年轻代最佳选择(存活率<10%时高效)

缺陷:

  • 内存利用率仅50%
  • 不适合大对象场景

3. 标记Credit整理(Mark-Compact)

三步机制

  1. 标记存活对象
  2. 计算对象迁移地址
  3. 滑动式整理(Sliding Compaction)

优势:

  • 100%内存利用率
  • 消除碎片问题

缺陷:

  • 三次堆遍历的高时间成本
  • 老年代整理的默认选择

分代式GC(Generational GC)

设计哲学

弱分代假说:绝大多数对象朝生夕灭
强分代假说:经历多次GC的对象更长寿

内存布局

33% 67% 堆内存分配比例 新生代(Young) 老年代(Old)
新生代细节:
  • 划分结构:Eden + Survivor*2(8:1:1)
  • 回收机制
    • Minor GC触发条件:Eden区满
    • 对象晋升阈值:-XX:MaxTenuringThreshold(默认15)
    • HotSpot实现:Parallel Scavenge(复制算法)
老年代管理:
  • Major GC触发条件:老年代空间不足
  • 算法实现
    • CMS(Mark-Sweep)
    • G1(局部复制+全局整理)

现代GC技术演进

  1. 增量式GC:允许GC与用户线程交替执行
  2. 并发标记:CMS/G1的并发标记阶段
  3. Region分区:G1/ZGC的内存管理单元
  4. 颜色指针:ZGC的元数据存储方案
  5. 读屏障:Shenandoah的并发处理技术

算法性能对比表

算法时间效率空间效率碎片率适用场景
标记-清除老年代(CMS)
复制算法新生代
标记-整理老年代(Serial)
分代GC极高混合全堆管理

性能调优启示

  1. 新生代大小设置 → 在STW时间与GC频率间找平衡
    -Xmn参数建议:老年代存活对象总量的1~1.5倍

  2. 空间分配担保机制:
    JDK6之后HandlePromotionFailure策略优化

  3. 大对象直接分配老年代:
    -XX:PretenureSizeThreshold参数控制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

王嘉俊925

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

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

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

打赏作者

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

抵扣说明:

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

余额充值