JVM 分代收集算法(Generational GC) 的原理和执行流程

1. 分代收集算法的核心思想

分代收集算法基于一个重要的经验假设

绝大多数对象都是"朝生夕死"的,只有少数对象会存活很久。

因此,JVM 将堆内存划分为不同的区域,并针对不同区域的对象生命周期特点,采用不同的垃圾回收策略,以提高效率、减少停顿时间。


2. 堆内存的分代结构

在 HotSpot JVM 中,堆通常分为:

  • 新生代(Young Generation)
    • Eden 区:新创建的对象首先分配在这里
    • Survivor 区:两个 Survivor 区(S0、S1)用于在 Minor GC 时存放存活对象
  • 老年代(Old Generation)
    • 存放生命周期较长的对象
  • 元空间(Metaspace)
    • 存放类元数据(不在堆中)

3. 分代收集算法的原理

不同代使用不同的 GC 算法:

  • 新生代 :对象存活率低 → 复制算法(Copying)
  • 老年代 :对象存活率高 → 标记-整理(Mark-Compact)标记-清除(Mark-Sweep)

这样做的好处:

  • 新生代 GC(Minor GC):速度快,内存碎片少
  • 老年代 GC(Major GC / Full GC):减少碎片,保证长期运行稳定

4. 分代收集算法的执行流程

4.1 新生代回收(Minor GC)

触发条件 :Eden 区满时触发
流程

  1. 标记存活对象:从 GC Roots 出发,标记 Eden 和 Survivor 中的存活对象
  2. 复制存活对象
    • 将存活对象从 Eden 和当前 Survivor 区复制到另一个 Survivor 区
    • 对象的年龄(Age)+1
  3. 晋升到老年代
    • 如果对象年龄超过阈值(默认 15),或 Survivor 区放不下,则晋升到老年代
  4. 清空 Eden 和原 Survivor 区:释放空间

4.2 老年代回收(Major GC / Full GC)

触发条件

  • 老年代空间不足
  • System.gc() 调用
  • 元空间溢出等特殊情况

流程

  1. 标记存活对象:从 GC Roots 出发,标记老年代的存活对象
  2. 整理或清除
    • 标记-整理:移动存活对象到一端,消除碎片
    • 标记-清除:直接清除未标记对象(可能产生碎片)
  3. 释放空间:更新分配指针

4.3 整体分代收集流程示意

阶段 区域 算法 特点
Minor GC 新生代 复制算法 快速、无碎片
Major GC 老年代 标记-整理 / 标记-清除 存活率高、减少碎片
Full GC 新生代 + 老年代 + 元空间 综合使用 停顿时间长

5. 分代收集的优势

  • 针对性强:不同代使用最适合的算法
  • 性能高:新生代 GC 快速,减少整体停顿
  • 碎片少:复制算法和整理算法减少内存碎片

总结: 分代收集算法的核心是:

  • 新生代 → 复制算法
  • 老年代 → 标记-整理 / 标记-清除
  • 根据对象生命周期特点优化回收策略
相关推荐
韩家阿杰1 小时前
RabbitMQ技术的使用
1024程序员节
CoderYanger14 小时前
动态规划算法-简单多状态dp问题:15.买卖股票的最佳时机含冷冻期
开发语言·算法·leetcode·动态规划·1024程序员节
CoderYanger15 小时前
递归、搜索与回溯-FloodFill:33.太平洋大西洋水流问题
java·算法·leetcode·1024程序员节
CoderYanger18 小时前
动态规划算法-斐波那契数列模型:2.三步问题
开发语言·算法·leetcode·面试·职场和发展·动态规划·1024程序员节
CoderYanger18 小时前
动态规划算法-简单多状态dp问题:16.买卖股票的最佳时机含手续费
开发语言·算法·leetcode·动态规划·1024程序员节
CoderYanger19 小时前
C.滑动窗口-求子数组个数-越短越合法——3258. 统计满足 K 约束的子字符串数量 I
java·开发语言·算法·leetcode·1024程序员节
CoderYanger20 小时前
动态规划算法-路径问题:9.最小路径和
开发语言·算法·leetcode·动态规划·1024程序员节
CoderYanger20 小时前
动态规划算法-路径问题:7.礼物的最大价值
开发语言·算法·leetcode·动态规划·1024程序员节
CoderYanger1 天前
动态规划算法-简单多状态dp问题:12.打家劫舍Ⅱ
开发语言·算法·leetcode·职场和发展·动态规划·1024程序员节
金融小师妹1 天前
机器学习驱动分析:ADP就业数据异常波动,AI模型预测12月降息概率达89%
大数据·人工智能·深度学习·编辑器·1024程序员节