- 概述:G1(Garbage-First)是Java专为超大堆内存设计的垃圾回收器,与CMS、SerialGC、ParallelGC并列。核心目标:低延迟(<200ms停顿)+ 高吞吐量,适用于大内存(>4GB)场景。
适用场景
- 低延迟要求(如实时系统)
- 超大堆内存(>4GB,避免Full GC)
- 需平衡吞吐量与停顿时间
核心机制
- 堆内存划分:固定大小Region(1MB~32MB),逻辑分为新生代、老年代、Humongous(巨型对象)。
- 算法组合:
- Region间:复制算法(新生代回收)
- Region内:标记-整理(老年代回收,避免碎片)
垃圾回收阶段(关键流程)
- 初始标记(Initial Mark):STW(暂停应用),标记GC Roots直接可达对象(极短,<10ms)。
- 并发标记(Concurrent Mark):并发执行(应用线程不停),遍历全堆标记可达对象(基于Remembered Set优化)。
- 最终标记(Remark/G1remark):STW,处理并发标记期间的引用变化(如跨代引用更新)。
- 混合回收(Mixed GC):
- 触发条件:老年代空间不足(非Full GC)
- 过程:
- 选择回收价值高的老年代Region(基于垃圾比例)
- 新生代:复制算法(Eden→Survivor,拷贝存活对象)
- 老年代:标记-整理(移动存活对象,压缩内存)
- 优势:并发执行,停顿时间可控(<200ms)。
关键特性
- 新生代回收:Eden区划分为多个小区(Region),复制算法(STW极短)。
- 跨代引用:通过Remembered Set(RS) 跟踪新生代→老年代引用,避免全堆扫描。
- 巨型对象(Humongous):>Region半大小的对象,直接分配连续Region,避免碎片。
- 字符串去重:
-XX:+UseStringDeduplication(JDK 8u20+),减少重复字符串内存占用。 - 类卸载:GC期间自动卸载无用类(与G1兼容,无需额外配置)。
- 动态调整阈值:
G1MixedGCCountTarget:动态控制混合回收的Region数量G1HeapWastePercent:动态调整堆垃圾比例阈值(默认5%)
- 老年代回收:内存不足时并发触发混合回收,避免Full GC(STW长停顿)。
注:G1通过Region划分和动态阈值,实现“优先回收垃圾最多区域”(Garbage-First),平衡延迟与吞吐。