首页 > 编程语言 >JVM G1垃圾回收器工作原理详解

JVM G1垃圾回收器工作原理详解

来源:互联网 2026-07-10 08:06:11

G1垃圾回收器将堆划分为多个相等Region,动态扮演Eden、Survivor或Old角色,通过回收价值排行优先清理垃圾最多的区域。并发标记依赖SATB写屏障和TAMS指针,实现与应用线程并行。MixedGC同时回收年轻代与老年代Region,基于历史数据预测模型动态调整回收量,确保停顿时间可控。

G1垃圾回收器的核心设计理念如下:它不是“一次扫完整个堆”的莽夫,而是采用一套动态、分区、可预测的内存管理策略。它将停顿时间控制放在首位,不追求绝对最短,而是让每次GC停顿尽量稳定、可控——例如设置-XX:MaxGCPauseMillis=200,G1就会努力让每次STW接近但不超过200ms。

Region分区:打破物理分代的老框框

G1将整个堆切分为多个大小相等的Region(通常1–32MB),每个Region可以动态扮演Eden、Survivor或Old角色。没有固定边界,也不强制连续——老年代和新生代只是逻辑概念,Region之间可以自由切换身份。这种设计带来两个关键好处:

长期稳定更新的攒劲资源: >>>点此立即查看<<<

  • 避免大块内存碎片:回收时按Region整体腾挪,天然支持压缩;
  • 支持增量式回收:每次只选一部分Region回收,不用锁死全部堆。

回收价值驱动:优先清理“最脏”的区域

“Garbage First”的名称源于此逻辑:G1持续跟踪每个Region的垃圾占比和回收成本(扫描+复制耗时),生成一张“回收价值排行榜”。每次Young GC或Mixed GC时,它不随机选择Region,而是从“高收益低开销”的几个Region入手——即垃圾最多、存活对象最少、搬运最快的那一组。这就像清洁工进仓库,不挨个打扫,而是先冲向堆满废纸箱的角落。

并发标记 + SATB + TAMS:边运行边标记的底层保障

标记阶段并非STW完成,而是依靠三者协同:

  • SATB写屏障:在标记开始瞬间拍下“快照”,之后所有被修改引用的对象(如断开旧引用)都会被记录到缓冲队列;
  • TAMS指针:标记启动时冻结堆顶位置,TAMS上方新分配的对象默认视为存活(隐式标记),不参与本次扫描;
  • 最终标记阶段:一次短暂停顿,专门处理SATB队列里的“漏标风险对象”,确保不会误删还活着的引用。

这套机制让大部分标记工作能与应用线程并发进行,大幅压缩STW时间。

Mixed GC与可预测停顿模型

G1不区分“只清年轻代”或“只清老年代”,它通过Mixed GC同时回收部分年轻代Region和部分老年代Region。触发条件不是老年代满了,而是:

  • 并发标记周期完成;
  • 老年代占用率超过阈值(-XX:InitiatingHeapOccupancyPercent,默认45%);
  • 且有足够多的待回收老Region被标记为候选。

更重要的是,G1内置一个运行时预测模型:根据历史GC数据(各Region处理耗时、对象晋升速率、扫描速度等),动态估算本次回收哪些Region能在目标停顿时间内完成。它不是硬性截断,而是主动取舍——宁可少收几个Region,也不能超时。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。