都叫“分代”,ZGC 和 G1 根本不是一回事:实测停顿差 1300 倍
同一套 Renaissance 基准,分代 ZGC 的停顿次数是 G1 的 6 倍,平均停顿却只有 G1 的 1/1300、最大停顿只有 1/2500;堆从 2G 涨到 5G,G1 最大停顿涨了 53%,ZGC 仍是 0.03ms。差别不只在参数:G1 分代是为了缩短 STW,ZGC 分代是为了降低并发回收成本——逻辑分代、并发收集年轻代、染色指针布局反转。
该标签下共 3 篇文章。文章数未达 5 篇,本页暂不被搜索引擎索引。
同一套 Renaissance 基准,分代 ZGC 的停顿次数是 G1 的 6 倍,平均停顿却只有 G1 的 1/1300、最大停顿只有 1/2500;堆从 2G 涨到 5G,G1 最大停顿涨了 53%,ZGC 仍是 0.03ms。差别不只在参数:G1 分代是为了缩短 STW,ZGC 分代是为了降低并发回收成本——逻辑分代、并发收集年轻代、染色指针布局反转。
进程在 YGC 里 SIGSEGV 挂掉,堆栈指向 G1 的 copy_to_survivor_space——看起来像 GC 的 bug。换收集器仍然崩,才说明 JVM 对象模型已被破坏。unsafe 的错误写入不会立刻报错,直接原因与根因的现场差距可以非常大。
白天有流量、夜间几乎空闲的服务,堆内存一直占着不放。这需要区分「JVM 已回收」和「操作系统已回收」两件事,G1 的周期性 uncommit 与 region 归还策略决定了后者什么时候发生。