JVM的G1垃圾回收器概念
G1 垃圾回收器的核心概念:
1. 分代收集(Generational Collection):
○ G1 仍然保留了分代收集的思想,将堆内存划分为新生代 (Young Generation) 和老年代 (Old Generation)。
○ 新生代又分为 Eden 区和 Survivor 区(通常有两个 Survivor 区,S0 和 S1)。
○ 对象首先在 Eden 区分配,当 Eden 区满时,触发 Young GC。
○ 存活下来的对象会被复制到 Survivor 区,经过多次 Young GC 仍然存活的对象会被晋升到老年代。
2. Region:
○ G1 将整个堆内存划分为多个大小相等的 Region (区域),每个 Region 的大小通常在 1MB 到 32MB 之间。
○ Region 是 G1 进行垃圾回收的基本单位,G1 不是对整个堆进行回收,而是对一部分 Region 进行回收。
○ Region 可以动态地扮演不同的角色,例如:
§ Eden Region: 用于分配新对象。
§ Survivor Region: 用于存放 Young GC 存活下来的对象。
§ Old Region: 用于存放老年代对象。
§ Humongous Region: 用于存放大于 Region 大小一半的大对象。
3. Remembered Set (RS):
○ 每个 Region 都有一个 Remembered Set (记忆集),用于记录该 Region 中被其他 Region 中的对象引用的对象。
○ RS 可以看作是一个 "指向该 Region 的入引用" 的集合,用于在垃圾回收时快速定位需要扫描的对象。
○ RS 可以避免扫描整个堆来查找哪些对象引用了当前 Region 中的对象。
4. Collection Set (CSet):
○ Collection Set (回收集合) 是 G1 垃圾回收器每次回收的 Region 的集合。
○ G1 会根据一定的策略选择回收哪些 Region,例如:
§ 选择垃圾最多的 Region 进行回收,以提高回收效率。
§ 选择回收新生代 Region,以更快回收垃圾。
§ 选择回收老年代 Region,以防止老年代内存溢出。
5. Mixed GC:
○ G1 的回收分为 Young GC 和 Mixed GC。
○ Young GC: 只回收新生代 Region (Eden + Survivor) 中的垃圾。
○ Mixed GC: 会回收一部分新生代 Region 和一部分老年代 Region 中的垃圾。
○ Mixed GC 是 G1 的核心特性之一,它可以平衡吞吐量和停顿时间。
6. 停顿预测模型 (Pause Prediction Model):
○ G1 会根据历史信息,预测下次垃圾回收需要花费的时间,从而动态调整回收策略。
○ G1 会尽量控制停顿时间在用户设定的目标范围内。
7. SATB (Snapshot-At-The-Beginning):
○ Snapshot-At-The-Beginning (初始快照) 是一种并发标记技术,用于在并发标记阶段记录对象的引用关系。
○ SATB 可以保证在并发标记过程中,不会漏标对象。
8. Card Table:
○ Card Table 是一种用于优化 RS 维护的数据结构。
○ Card Table 将堆内存划分为多个 Card (卡),每个 Card 通常是 512 字节。
○ 当一个 Region 中的对象引用了另一个 Region 中的对象时,就将该对象所在的 Card 标记为 "脏",表示该 Card 中的对象可能包含对其他 Region 的引用。
○ 在垃圾回收时,只需要扫描 "脏" Card 即可,无需扫描整个 Region,提高了效率。
G1 的工作流程:
1. 初始标记 (Initial Mark): 标记从根对象可达的对象,需要 STW。
2. 并发标记 (Concurrent Mark): 并发地标记所有可达对象,不需要 STW。
3. 最终标记 (Final Mark): 在并发标记结束后,标记一些遗漏的对象,需要 STW。
4. 筛选回收 (Live Data Counting and Evacuation): 根据每个 Region 中的垃圾数量,选择回收的 Region,并进行复制和清理。
5. 清理 (Cleanup): 清理回收过程中产生的垃圾。
G1 的优势:
• 可预测的停顿时间: G1 可以控制停顿时间在用户设定的目标范围内。
• 高吞吐量: G1 可以高效地回收垃圾,提高应用程序的吞吐量。
• 更好的内存利用率: G1 可以更充分地利用内存,减少内存浪费。
• 更适合大堆内存: G1 更适合用于管理大堆内存。
G1 的适用场景:
• 需要低停顿时间的应用程序: 例如,在线交易系统、实时数据分析系统等。
• 大堆内存应用程序: 例如,大型电商平台、大数据处理平台等。
• 对吞吐量和停顿时间都有要求的应用程序。
总结:
版权申明
本文系作者 @Tis-FYM 原创发布在Tis-FYI站点。未经许可,禁止转载。
评论