温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java老年代怎么回收

发布时间:2026-10-30 17:19:53 来源:亿速云 阅读:104 作者:小樊 栏目:编程语言

在 Java(以最常见的 HotSpot 虚拟机为例)中,老年代(Old Generation)的垃圾回收和年轻代不同,通常发生频率低,但耗时更长,也更复杂。下面从触发条件、回收算法、常见收集器、流程几个方面说明。


一、老年代什么时候会回收?

老年代 GC(通常叫 Major GC / Old GC,有时和 Full GC 相关)一般在以下情况触发:

  1. 老年代空间不足
    • 对象直接在老年代分配(大对象)
    • 年轻代存活对象晋升(Promotion)到老年代时放不下
  2. 显式调用
    • System.gc()(只是“建议”,不保证)
  3. 元空间(Metaspace)不足
    • 可能触发 Full GC
  4. CMS / G1 等收集器的后台阈值触发
    • 比如老年代占用率达到一定比例

二、老年代常用回收算法

老年代对象存活率高,不能使用“复制算法”,常见算法是:

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

  • 标记存活对象
  • 清除未标记对象
  • 缺点:产生内存碎片

2. 标记-整理(Mark-Compact)

  • 标记存活对象
  • 将存活对象向一端移动
  • 清理边界外内存
  • 优点:无碎片
  • 缺点:移动对象成本高

现代老年代 GC 大多基于 标记-整理 或 并发标记 + 整理。


三、常见老年代垃圾收集器

1. Serial Old(串行)

  • 单线程
  • 标记-整理
  • 用于客户端或小型应用

2. Parallel Old

  • 多线程
  • 标记-整理
  • 注重吞吐量

3. CMS(Concurrent Mark Sweep)✅ 老年代经典

流程:

  1. 初始标记(STW)
  2. 并发标记
  3. 重新标记(STW)
  4. 并发清除

特点:

  • 低停顿
  • 使用标记-清除
  • 有碎片问题
  • JDK 9 后废弃

4. G1(Garbage First)✅ 主流

  • 逻辑分代,物理不分代
  • 老年代由多个 Region 组成
  • 可预测停顿时间
  • 使用 标记-整理
  • Mixed GC 会回收老年代 + 年轻代

5. ZGC / Shenandoah(新一代)

  • 几乎全并发
  • 停顿时间极短(毫秒级)
  • 使用染色指针 / 读屏障

四、老年代回收的一般流程(以 CMS 为例)

  1. 初始标记:标记 GC Roots 直接关联对象(短 STW)
  2. 并发标记:遍历对象图
  3. 重新标记:修正并发期间变化(短 STW)
  4. 并发清理:回收垃圾

如果并发失败 → 退化为 Serial Old(Full GC)


五、如何减少老年代 GC?

  • 避免频繁创建大对象
  • 合理设置堆大小和新生代比例
  • 避免内存泄漏
  • 选择合适 GC(G1 / ZGC)
  • 控制对象晋升年龄

如果你愿意,我可以:

  • 用 图解方式说明老年代 GC
  • 对比 CMS vs G1
  • 结合 JVM 参数调优
  • 针对 某个 JDK 版本讲细节

你可以告诉我你的 JDK 版本和使用场景。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手