G1垃圾回收器将堆划分为多个相等Region,动态扮演Eden、Survivor或Old角色,通过回收价值排行优先清理垃圾最多的区域。并发标记依赖SATB写屏障和TAMS指针,实现与应用线程并行。MixedGC同时回收年轻代与老年代Region,基于历史数据预测模型动态调整回收量,确保停顿时间可控。
G1垃圾回收器的核心设计理念如下:它不是“一次扫完整个堆”的莽夫,而是采用一套动态、分区、可预测的内存管理策略。它将停顿时间控制放在首位,不追求绝对最短,而是让每次GC停顿尽量稳定、可控——例如设置-XX:MaxGCPauseMillis=200,G1就会努力让每次STW接近但不超过200ms。
G1将整个堆切分为多个大小相等的Region(通常1–32MB),每个Region可以动态扮演Eden、Survivor或Old角色。没有固定边界,也不强制连续——老年代和新生代只是逻辑概念,Region之间可以自由切换身份。这种设计带来两个关键好处:
长期稳定更新的攒劲资源: >>>点此立即查看<<<
“Garbage First”的名称源于此逻辑:G1持续跟踪每个Region的垃圾占比和回收成本(扫描+复制耗时),生成一张“回收价值排行榜”。每次Young GC或Mixed GC时,它不随机选择Region,而是从“高收益低开销”的几个Region入手——即垃圾最多、存活对象最少、搬运最快的那一组。这就像清洁工进仓库,不挨个打扫,而是先冲向堆满废纸箱的角落。
标记阶段并非STW完成,而是依靠三者协同:
这套机制让大部分标记工作能与应用线程并发进行,大幅压缩STW时间。
G1不区分“只清年轻代”或“只清老年代”,它通过Mixed GC同时回收部分年轻代Region和部分老年代Region。触发条件不是老年代满了,而是:
-XX:InitiatingHeapOccupancyPercent,默认45%);更重要的是,G1内置一个运行时预测模型:根据历史GC数据(各Region处理耗时、对象晋升速率、扫描速度等),动态估算本次回收哪些Region能在目标停顿时间内完成。它不是硬性截断,而是主动取舍——宁可少收几个Region,也不能超时。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述