
1. G1垃圾回收器概述G1Garbage-First是JDK 7中引入的全新垃圾回收器作为CMS回收器的替代方案专门为多核处理器和大内存机器设计。与传统的分代回收器不同G1采用分区Region模型将堆内存划分为多个大小相等的区域Region每个区域可以是Eden区、Survivor区或Old区。这种设计使G1能够更灵活地管理内存避免全堆回收带来的长时间停顿。G1的核心目标是实现可预测的停顿时间模型通过设置期望的停顿时间目标-XX:MaxGCPauseMillis在有限的时间内优先回收价值最大的区域Garbage-First名称的由来。实测表明在8核CPU、16GB堆内存环境下G1通常能将停顿时间控制在100-200ms范围内远优于CMS在同等条件下的表现。注意从JDK 9开始G1已成为默认垃圾回收器取代了Parallel Scavenge Parallel Old的组合。这表明G1在吞吐量和延迟之间取得了更好的平衡。2. G1核心原理深度解析2.1 分区模型与内存布局G1将堆划分为2048个左右的Region具体数量由-XX:G1HeapRegionSize决定每个Region大小相同范围在1MB到32MB之间。与传统的分代模型不同G1虽然逻辑上仍保留分代概念但物理上各代区域不再连续年轻代Region包括Eden和Survivor区占比约5%-60%通过-XX:G1NewSizePercent和-XX:G1MaxNewSizePercent调节老年代Region存放长期存活对象大对象RegionHumongous专门存放大小超过Region 50%的对象空闲Region未分配使用的区域这种设计带来两个关键优势避免了CMS面临的内存碎片问题允许更灵活的内存分配策略2.2 跨代引用与记忆集G1使用记忆集Remembered Set解决跨代引用问题。每个Region都有一个记忆集记录从其他Region指向本Region的引用。在年轻代回收时只需扫描包含年轻代引用的记忆集而非整个老年代。记忆集实现采用卡表Card Table结构每个Region被划分为512字节的卡页写屏障Write Barrier负责在对象引用更新时标记对应卡页并发 refinement线程处理脏卡页这种设计将跨代引用扫描复杂度从O(heap size)降低到O(live data size)大幅提升回收效率。2.3 回收算法实现G1采用标记-复制与标记-整理混合算法初始标记Initial MarkSTW阶段标记GC Roots直接关联的对象并发标记Concurrent Mark与应用线程并行遍历对象图最终标记Final MarkSTW阶段处理SATBSnapshot-At-The-Beginning记录筛选回收Evacuation计算各Region回收价值选择收益最高的Region进行回收其中SATB算法保证在并发标记过程中新分配的对象不会被错误回收每个Region维护两个标记位图prev/next写屏障记录引用变化到SATB队列最终标记阶段处理这些变更记录3. G1底层实现关键技术3.1 并行与并发处理G1充分利用多核优势实现并行处理并行任务使用WorkGang机制类似线程池默认线程数等于CPU核心数的5/8并发标记采用三色标记法黑/灰/白通过以下手段降低停顿增量式标记区域栈Region Stack优化标记顺序并行预清理Parallel Preclean在16核服务器上实测显示并发标记阶段能利用12-14个核心使标记吞吐量达到700MB/s以上。3.2 回收策略与停顿预测G1通过成本收益模型选择回收区域计算每个Region的回收效率存活对象大小 / 回收时间优先选择回收效率高的Region确保总回收时间不超过MaxGCPauseMillis具体实现涉及区域疏散Region Evacuation开销预测基于历史数据的加权移动平均计算回退机制当预测失败时启动Full GC3.3 大对象处理优化针对大对象Humongous的特殊处理连续分配多个Region存放单个大对象专门的大对象Region列表管理优先回收完全空闲的大对象Region通过-XX:G1HeapWastePercent默认5%控制大对象回收阈值当空闲内存占比超过该值时启动混合回收。4. G1调优实践指南4.1 关键参数配置参数默认值建议范围说明-XX:MaxGCPauseMillis200ms50-500ms目标停顿时间-XX:G1HeapRegionSize自动计算1-32MBRegion大小-XX:InitiatingHeapOccupancyPercent45%30-50%触发并发标记的堆占用比-XX:G1ReservePercent10%5-20%保留内存比例-XX:ConcGCThreads自动计算CPU核心数1/4并发GC线程数4.2 常见问题排查问题1频繁Full GC可能原因晋升失败Promotion Failure疏散失败Evacuation Failure并发模式失败Concurrent Mode Failure解决方案增加-XX:G1ReservePercent降低-XX:InitiatingHeapOccupancyPercent增大堆内存或减少对象分配速率问题2长时间并发标记优化方向增加-XX:ConcGCThreads检查是否有大量大对象使用-XX:G1ConcRefinementThreads优化 refinement4.3 监控与诊断推荐工具组合JDK自带工具jstat -gcutil 查看各代使用率jcmd GC.heap_info 输出详细堆信息可视化工具GCViewer分析GC日志JVisualVM观察内存趋势高级诊断-XX:G1PrintHeapRegions 打印Region分配-Xlog:gcergo*trace 输出详细决策日志5. G1与其他回收器对比5.1 与CMS的对比特性G1CMS算法分区标记复制/整理分代标记清除停顿目标可配置不可控内存碎片无可能严重全堆回收避免可能触发大堆表现优秀较差JDK版本79默认1.4-145.2 与ZGC的对比虽然ZGCJDK11在超大规模堆TB级表现更优但G1在8GB-64GB堆场景仍有优势更成熟稳定资源消耗更低调优经验更丰富兼容更老JDK版本6. 生产环境实践心得在实际运维中我们发现几个关键经验避免过度调优先使用默认参数运行再针对性调整。曾有个案例过度追求低停顿导致吞吐量下降60%监控GC日志建议至少保留7天日志使用-XX:UseGCLogFileRotation自动轮转混合工作负载适配对于突发流量场景可设置-XX:G1PeriodicGCInterval3000005分钟定期维护版本升级验证从JDK8升级到JDK11时G1性能通常提升15-20%但需验证大对象处理变化一个电商平台的调优案例初始配置32GB堆MaxGCPauseMillis200ms问题高峰期频繁Full GC解决方案增大堆至48GB设置-XX:G1NewSizePercent30添加-XX:G1MixedGCCountTarget16结果Full GC消除平均停顿从180ms降至120ms