堆内存结构逻辑分代物理Region化整个Java堆被划分为‌2048个左右、大小相等的Region‌默认1MB~32MB2的幂。每个Region‌动态扮演‌Eden、Survivor、Old或Humongous角色‌无固定边界‌。逻辑分代‌对象年龄、晋升规则仍沿用传统分代模型物理不分代‌Region可自由转换用途实现‌弹性内存管理‌。 ‌关键突破‌传统GC按“整代”回收 → G1按“Region收益”回收。这是“Garbage-First”名称的由来‌优先回收垃圾占比最高的Region‌。跨Region引用管理Remembered SetRSet每个Region维护一个‌RSet‌记录“‌哪些Region引用了我‌”。解决Region化带来的核心问题‌回收A Region时如何知道B Region有没有引用A中的对象‌RSet通过‌Card Table 写屏障‌实现高效维护每次对象引用变更触发写屏障更新对应Card回收时仅扫描相关Card避免全堆扫描。⚠️ 代价RSet占用额外内存约堆的1%~5%但换来了‌YGC不再扫描老年代‌的性能飞跃。并发标记三色标记 SATB快照目标‌在应用线程运行时‌精确标记所有存活对象‌避免漏标/错标。‌四阶段流程‌初始标记Initial Mark‌STW标记GC Roots直接引用对象极短并发标记Concurrent Marking‌与应用并发遍历对象图标记可达对象最终标记Remark‌STW处理并发期间新生成的引用SATB机制保障‌存活对象计数‌统计每个Region的存活对象数量计算存活率。 ‌SATBSnapshot-At-The-Beginning机制‌在并发标记开始时对对象图做“快照”。即使对象引用在标记中被修改仍按快照判断是否可达 → ‌杜绝漏标‌。Mixed GC预测性回收避免Full GC触发条件‌堆使用率 ≥ -XX:InitiatingHeapOccupancyPercent默认45%。核心策略‌只回收‌存活率 ≤ -XX:MixedGCLiveThresholdPercent‌默认85%的Region。‌调度机制‌G1维护一个‌“回收优先级列表”‌按‌单位时间回收空间‌收益/成本排序每次Mixed GC选择‌最多N个Region‌由-XX:G1MixedGCCountTarget控制默认8确保停顿可控。执行动作‌‌复制存活对象‌到空闲Region‌更新所有引用指针‌通过RSet和Card Table‌原Region空间完全释放‌。✅ ‌洞察真相‌G1不是“等老年代满了才GC”而是‌在堆使用率45%~60%时就悄悄开始收割“半死Region”‌把一场灾难性Full GC拆解成‌上百次毫秒级的微小清理‌。预测性停顿模型可预测的低延迟用户设定-XX:MaxGCPauseMillis200默认200msG1动态建模‌历史回收耗时 Region垃圾密度‌ → 预测下次能回收多少Region‌目标‌在200ms内‌最大化回收空间‌而非“尽可能多回收” 示例若每个Region平均回收耗时40ms → 一次Mixed GC最多选5个Region若某Region垃圾占比95%但回收耗时120ms → 可能被跳过优先选“性价比高”的 G1工作流完整生命周期动态闭环graph TD A[对象分配] -- B[Eden Region满] B -- C[触发YGC] C -- D[复制存活对象到Survivor] D -- E[对象年龄≥阈值 → 晋升Old] E -- F[堆使用率 ≥ IHOP(45%)?] F -- 是 -- G[启动并发标记周期] G -- H[并发标记 SATB] H -- I[最终标记 RSet更新] I -- J[计算各Region存活率] J -- K[筛选存活率 ≤ 85% 的Region] K -- L[触发Mixed GC] L -- M[复制存活对象 → 新Region] M -- N[更新所有引用指针] N -- O[释放原Region空间] O -- P[堆使用率下降] P -- Q[避免Full GC] Q -- A