G1 GC的CSet选择算法如何权衡回收价值与停顿时间,具体分析是什么?

2026-04-29 08:581阅读0评论SEO资源
  • 内容介绍
  • 相关推荐

本文共计1093个文字,预计阅读时间需要5分钟。

G1 GC的CSet选择算法如何权衡回收价值与停顿时间,具体分析是什么?

G1垃圾回收器选择根区域的目标不是最大化回收量,而是满足用户设定的`MaxGCPauseMillis`(默认200ms)。它将整个堆分为大小相等的区域,每个区域维护一个回收价值指标——即`predicted_elapsed_time`(预测回收耗时)与`reclaimable_bytes`(可回收字节数)的比值。这个比值代表单位时间内能回收多少内存,比值越高,区域越优先被回收。

实际选择时,G1 按该比值从高到低排序 region,逐个加入 CSet,直到预估总停顿时间逼近但不超过目标值。这意味着:

  • 一个巨型、碎片少、存活对象极少的 region,哪怕只含 1MB 可回收内存,也可能因预测耗时极低(0.5ms)而被优先选中
  • 一个中等大小但跨代引用多、RSet 更新重、卡表扫描慢的 region,即使可回收 5MB,也可能因预测耗时飙到 80ms 被跳过
  • G1MixedGCCountTargetG1OldCSetRegionThresholdPercent 会影响老年代 region 的入选倾向,但不改变“价值优先+时间封顶”的底层逻辑

如何用 JVM 参数和日志验证 CSet 构成

开启详细 GC 日志后,每次 Mixed GC 开始前会打印 CSet 的 region 统计。

阅读全文

本文共计1093个文字,预计阅读时间需要5分钟。

G1 GC的CSet选择算法如何权衡回收价值与停顿时间,具体分析是什么?

G1垃圾回收器选择根区域的目标不是最大化回收量,而是满足用户设定的`MaxGCPauseMillis`(默认200ms)。它将整个堆分为大小相等的区域,每个区域维护一个回收价值指标——即`predicted_elapsed_time`(预测回收耗时)与`reclaimable_bytes`(可回收字节数)的比值。这个比值代表单位时间内能回收多少内存,比值越高,区域越优先被回收。

实际选择时,G1 按该比值从高到低排序 region,逐个加入 CSet,直到预估总停顿时间逼近但不超过目标值。这意味着:

  • 一个巨型、碎片少、存活对象极少的 region,哪怕只含 1MB 可回收内存,也可能因预测耗时极低(0.5ms)而被优先选中
  • 一个中等大小但跨代引用多、RSet 更新重、卡表扫描慢的 region,即使可回收 5MB,也可能因预测耗时飙到 80ms 被跳过
  • G1MixedGCCountTargetG1OldCSetRegionThresholdPercent 会影响老年代 region 的入选倾向,但不改变“价值优先+时间封顶”的底层逻辑

如何用 JVM 参数和日志验证 CSet 构成

开启详细 GC 日志后,每次 Mixed GC 开始前会打印 CSet 的 region 统计。

阅读全文